Stm32的时钟配置
** 时钟的来源**在Stm32中,有5个时钟源,分别为
时钟源 | 说明 |
---|---|
HSI (高速内部时钟) | RC振荡器,频率为8MHz |
HSE (高速外部时钟) | 外接的有源或无源晶振,常用8M、16M、25M等频率,是实际应用中主要使用的时钟源 |
LSI (低速内部时钟) | RC振荡器,频率40KHz |
LSE(低速外部时钟) | 外接32.768kHz的晶振,主要给RTC时钟使用,不使用RTC功能可不接 |
PLL(锁相环倍频输出) | 将内部或外部时钟倍频得到的频率,该频率可作为系统时钟,在Stm32F1中系统时钟最高频率为72M ,系统时钟也可由HSI HSE提供,但通常是由PLL作为系统时钟源 |
使用Stm32CobeMX可以很直观地了解整个时钟树的构成
系统时钟,其中左下角8M的input frequency 就是外接晶振的频率,作HSE时钟源,要得到需要的sysclk需要对HSE分频,然后选择PLL的源为HSE,然后经倍频后在选择PLLclk作为sysclk的源
1、在标准库中,一般设置外部高速晶振频率的地方在stm32f10x.h中,可以按需修改
2、在标准库中,stm32f10x.h的SystemInit函数中初始化时钟配置
使能内部高速时钟,复位时钟源选择、HSE、PLL、CSS等功能,旁路外部高速时钟晶体振荡器—使用外部震荡器(有源晶振)需要旁路掉芯片内部自带的振荡器,设置HSI时钟2分频后作为PLL时钟源、HSE不分频、PLL2倍频作系统时钟、PLL1.5倍频作USB时钟 。
然后调用SetSysClock();函数自由配置时钟参数。标准库这里通过宏定义判断设置的目标频率选择函数
主频宏定义在syste_Stm32f10x.c中
3、当选择72M频率时,SetSysClockTo72()函数分析
a、打开HSE使能
b、使能预取缓冲区; 设置SYSCLK 周期与闪存访问时间的比例为2,设置成 2 的时候, SYSCLK 低于 48M 也可以工作,如果设置成 0 或者 1 的时候,如果配置的 SYSCLK 超出了范围的话,则会进入硬件错误,程序就死了
c、设置预分频,如上时钟树图中,相当于AHB prescaler、APB1 prescaler、 APB2 prescaler三个框分别设置为1、2、1
c、设置PLL的源为HSE、倍频系数为9、打开PLL
d、选择PLL作为系统时钟源
所以设置完成后通过使能HSE、PLL,选择HSE不分频作为PLL的源,选择PLL9倍频作为系统时钟源得到72M的系统时钟;AHB不分频,APB12分频,APB2不分频,USB1.5分频得到相应的外设时钟(见时钟树图)