stm32系统复位后,会执行SystemInit()进行时钟的初始化:函数
次函数的工做以下:ui
1.RCC->CR |= (uint32_t)0x00000001;spa
将HSI时钟模块内部的8MHZ的RC振荡器使能,至关于此时系统时钟为sysclk=8MHZit
2.RCC->CFGR &= (uint32_t)0xF8FF0000;配置
复位各类分频值,且配置HSI做为系统时钟总结
3.RCC->CR &= (uint32_t)0xFEF6FFFF;di
使能PLL,关闭时钟检测器,HSE振荡器使能。为下一步切换系统时钟作准备while
4.RCC->CR &= (uint32_t)0xFFFBFFFF;工作
外部1-25MHz外部晶体振荡器被旁路
void
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