stm32学习笔记

来源:互联网 发布:超市打印软件 编辑:程序博客网 时间:2024/06/05 10:24

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




原创粉丝点击