STM32有五種時鐘源
1、HSI。高速內部時鐘,RC振蕩器,頻率為8MHz。
2、HSE。高速外部時鐘,可接石英/陶瓷諧振器,或者借外部時鐘源,頻率范圍為4MHz~16MHz。
3、PLL。鎖相環倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇2~16倍,其輸出頻率最大不能超過72MHz(STM32F1)。
4、LSI。低速內部時鐘,RC振蕩器,頻率為40KHz。獨立看門狗的時鐘源只能是LSI,同事LSI還可以作為RTC的時鐘源。
5、LSE。低速外部時鐘,接頻率為32.768KHz的石英晶體。這個主要是RTC的時鐘源。
?
時鐘樹如下圖
?
?時鐘的配置可使用STM32CubeMX來作為參考
從配置圖可觀察到,當外部時鐘源為8M時,通過PLL9倍倍頻 后得到72M,即SYSCLK為72M。
其中需要注意的是,APB1上連接的是低速外設,最大時鐘為36M;
APB2上連接的是高速外設,最大時鐘為72M。
兩者連接的定時器時鐘都為72M。
?
系統時鐘配置函數是system_stm32f10x.c中的SystemInit(),它調用了SetSysClock();
/*** @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.* @param None* @retval None*/
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSESetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHzSetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHzSetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHzSetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHzSetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHzSetSysClockTo72();
#endif/* If none of the define above is enabled, the HSI is used as System clocksource (default after reset) */
}
可以看出可以通過宏定義來配置系統時鐘為多少。同時最后的注釋告訴我們,如果沒有任何HSE的宏定義被使能,HSI將被用為系統時鐘源。
例如72M的時鐘
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000
#else
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000
#endif
?