×

Внимание

Форум находится в режиме только для чтения.

Запуск STM32F103VET6 от внутреннего кварца

11 года 4 мес. назад #3580 от Stepanov Ivan
Здравтвуйте люди добрые! Кто нить занимался данным вопросом? Итересует возможность запуска мк на  тактовой частоте в 1МГц. Вычитал что HSI на 8МГц, и вроде как есть возможность уменьшить эту частоту в двое, те 4МГц в итоге, через PLL?
11 года 4 мес. назад #3582 от Kerensky
Да у него есть внутренняя RC цепь на 8 МГц
ее можно использовать как источник тактирования мк (HSI)
или как источник тактирования для внутреннего множетеля (PLL)
в первом случае вы получите тактирование в 8 МГц
во втором от 16 до 72 с шагом в 4 МГц

Но, у мк есть предделитель на шину периферии исключая USB, наз. AHB Prescaler
кроме того есть еще предделители на отдельные части (AHB1, AHB2, ADC Prescaller)
с помощю этого на периферию можно подать 1 МГц

вот простенький код как от внутреннего кварца подать на периферию 1 МГц

//Настройка PLL
  RCC->CFGR  &= ~RCC_CFGR_PLLSRC;        //Источником сигнала для PLL выбран HSI с делением на 2
  RCC->CR  &= ~RCC_CR_PLLON;            //Отключить генератор PLL
  RCC->CFGR &= ~RCC_CFGR_PLLMULL;        //Очистить PLLMULL
  RCC->CFGR |=  RCC_CFGR_PLLMULL4;      //Коефициент умножения = 4
  RCC->CR  |=  RCC_CR_PLLON;            //Включить генератор PLL
  while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL

  //Переключиться на тактирование от PLL
  RCC->CFGR &= ~RCC_CFGR_SW;            //Очистка битов выбора источника тактового сигнала
  RCC->CFGR |=  RCC_CFGR_SW_PLL;        //Выбрать источником тактового сигнала PLL
  while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){}//Ожидание переключения на PLL
  //Настроить делитель для AHB
  RCC->CFGR &= ~RCC_CFGR_HPRE;          //Очистка битов предделителя "AHB Prescaler"
  RCC->CFGR |=  RCC_CFGR_HPRE_DIV16;      //Установить "AHB Prescaler" равным 16
11 года 4 мес. назад #3583 от Stepanov Ivan
ясно, а как в таком случае запустить тактирование от HSI напрямую, без предделителей?
11 года 4 мес. назад #3584 от Kerensky
ваще 4 строчки

  RCC->CR  |=  RCC_CR_HSION;            //Включить генератор HSI
  while((RCC->CR & RCC_CR_HSIRDY)==0) {} //Ожидание готовности HSI
  RCC->CFGR &= ~RCC_CFGR_SW;            //Очистка битов выбора источника тактового сигнала
  RCC->CFGR |=  RCC_CFGR_SW_HSI;        //Выбрать источником тактового сигнала HSI

будет 8 МГц +- 1% при 25 градусах С
11 года 4 мес. назад #3585 от Kerensky
или 1 МГц без PLL

  RCC->CR  |=  RCC_CR_HSION;            //Включить генератор HSI
  while((RCC->CR & RCC_CR_HSIRDY)==0) {} //Ожидание готовности HSI
  RCC->CFGR &= ~RCC_CFGR_SW;            //Очистка битов выбора источника тактового сигнала
  RCC->CFGR |=  RCC_CFGR_SW_HSI;        //Выбрать источником тактового сигнала HSI
  //Настроить делитель для AHB
  RCC->CFGR &= ~RCC_CFGR_HPRE;          //Очистка битов предделителя "AHB Prescaler"
  RCC->CFGR |=  RCC_CFGR_HPRE_DIV8;      //Установить "AHB Prescaler" равным 8
11 года 4 мес. назад #3586 от Stepanov Ivan
Судя по регистрам RCC_CR и RCC_CFGR, HSI у меня запущен и ждет действий (выставил флаг готовности), а согласно коду биьлиотеки system_stm32f10x.c:

#else /*!< HSI Selected as System Clock source */
  const uint32_t SystemFrequency        = HSI_Value;                /*!< System Clock Frequency (Core Clock) */
  const uint32_t SystemFrequency_SysClk  = HSI_Value;                /*!< System clock                        */
  const uint32_t SystemFrequency_AHBClk  = HSI_Value;                /*!< AHB System bus speed                */
  const uint32_t SystemFrequency_APB1Clk = HSI_Value;                /*!< APB Peripheral bus 1 (low)  speed  */
  const uint32_t SystemFrequency_APB2Clk = HSI_Value;                /*!< APB Peripheral bus 2 (high) speed  */
#endif

на шины перефирии уже должно быть подано значение частоты HSI. так ли это?
да, и еще, почему то значение бита RCC_CR_HSEON равно 1, хотя я не выставлял его :-\ из за этого у меня тактирование по HSI не проходит?
Время создания страницы: 0.052 секунд
Работает на Kunena форум