stm32系统时钟初始化解析
系统初始化函数
注:该初始化函数是参考正点原子战舰V3的库函数 void SystemInit(void)
系统初始化主要是对时钟进行配置,首先将RCC时钟配置复位为默认状态,然后再开始配置时钟。最后配置完成的时钟如图所示:参考STM32 中文参考手册p118
步骤如下:
PS:以下注释中的寄存器名字意义请参考STM32中文手册p60,其中有很多的条件编译,没有执行的部分均直接跳过,初始化流程按照战舰V3的逻辑分析。
1、RCC->CR |= (uint32_t)0x00000001; //开启内部高速时钟HSI
2、RCC->CFGR &= (uint32_t)0xF0FF0000; //复位SW,HPRE,PPRE1,PPRE2,ADCPRE,MCO
3、RCC->CR &= (uint32_t)0xFEF6FFFF; //复位HSE,CSS,PLL时钟
4、RCC->CR &= (uint32_t)0xFFFBFFFF; //复位HSEBYP(外部高速时钟旁路)
5、RCC->CFGR &= (uint32_t)0xFF80FFFF; //复位PLLSRC,PLLXTPRE,PLLMUL,USBPRE,OTGFSPRE
6、RCC->CIR = 0x009F0000; //禁止使能所有中断,清除所有的5个时钟的就绪中断标志位xxxRDYE
7、SetSysClock(); //该函数是用于设置系统时钟为72Mhz (进入该函数可知)
在SetSysClock()函数中,根据条件编译可知,宏定义仅有SYSCLK_FREQ_72MHz,因此直接执行最后一个函数SetSysClockTo72()。进入该函数,然后开始设置系统时钟到72 Mhz,并且配置HCLK,PCLK2,PCLK1预分频器。以下为 SetSysClockTo72()函数内部解析,该函数一步步将系统时钟配置为72Mhz:
1、首先使能HSE(如果使能失败,需要用户自己编写代码进行处理,例如换成其他晶振)
2、等待并判断HSE是否准备就绪
3、当HSE就绪以后,使能flash的预取buffer、并获取等待状态(此处我也暂不清楚)
4、将HCLK设置为系统时钟(1分频):72Mhz
5、将PCLK2(APB2)设置为HCLK(1分频):72Mhz
6、将PCLK1(APB1)设置为HCLK的2分频:36Mhz
7、配置PLL=HSE*9,倍频为72Mhz
8、使能PLL
9、等待PLL就绪
10、PLL就绪以后,选择PLL作为系统时钟源
11、等待PLL被设置为系统时钟源(直到设置成功为止)
版权声明:本文为qq_39887918原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。