stm32学习笔记

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