stm32系统复位后,会执行SystemInit()进行时钟的初始化:
次函数的工作如下:
1.RCC->CR |= (uint32_t)0x00000001;
将HSI时钟模块内部的8MHZ的RC振荡器使能,相当于此时系统时钟为sysclk=8MHZ
2.RCC->CFGR &= (uint32_t)0xF8FF0000;
复位各种分频值,且配置HSI作为系统时钟
3.RCC->CR &= (uint32_t)0xFEF6FFFF;
使能PLL,关闭时钟检测器,HSE振荡器使能。为下一步切换系统时钟做准备
4.RCC->CR &= (uint32_t)0xFFFBFFFF;
外部1-25MHz外部晶体振荡器被旁路
5.RCC->CFGR &= (uint32_t)0xFF80FFFF;
PLL时钟输出的1.5倍分频作为USB时钟
PLL 2倍频输出得到PLL时钟
HSE不分频
HSI 时钟2分频后作为PLL输入时钟
经过上面的配置:PLLCLK = 8MHZ
6.RCC->CIR = 0x009F0000;
清除中断标志位:CSS、PLL、HSE、HIS、LSE、LSI
7. SetSysClock();
跳转执行8
8.SetSysClockTo72(void)
8.1RCC->CR |= ((uint32_t)RCC_CR_HSEON);
使能HSE振荡器
8.2
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
判断外部晶振是否稳定就绪,且有没有超时
8.3如果HSE外部晶振已经就绪设置HSEStatus = 1,否则设置为0
8.4如果外部晶振已经稳定就绪
(1).设置闪存寄存器ACR的 预取缓冲区开启,同时设置2个等待状态。
当 48MHz < SYSCLK ≤ 72MHz,要设置2个等待时钟,系统时钟和闪存访问周频的比例
(2).设置APB1 2分频
(3). RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
选择HSE为时钟源,PLL的倍频系数为9
因此如果外接晶振是8MHZ。此时PLLCLK = 8MHZ*9=72MHZ
(4).使能PLL
(5).等待PLL稳定就绪
(6)设置PLLCLK 作为系统时钟
(7).等待PLL切换成功
此时sysclk=72MHZ
---------------------------------------------------------------------------------------------------------------------------
总结:
如果外部晶振是8MHZ,调用SystemInit()后,系统各时钟结果如下:
SysClk=72MHZ
AHBCLK = 72MHZ
APB1CLK=36MHZ
APB2CLK=72MHZ