STM32系统时钟初始化函数
### STM32系统时钟初始化函数解析 #### 一、STM32系统时钟初始化概述 在嵌入式系统开发中,尤其是针对基于ARM Cortex-M内核的微控制器如STM32系列,系统时钟的初始化是至关重要的一步。STM32提供了丰富的时钟配置选项,包括但不限于高速外部时钟(HSE)、高速内部时钟(HSI)、低速外部时钟(LSE)、低速内部时钟(LSI)以及锁相环(PLL)等。本篇文章将重点介绍STM32中系统时钟初始化的相关知识点,并深入分析代码中出现的疑问。 #### 二、STM32系统时钟初始化详解 ##### 1. 初始化前的准备 在进行时钟初始化之前,通常需要执行一些预处理操作,例如复位配置向量表、使能外部高速时钟(HSE)等。这些步骤确保了后续时钟配置能够在正确的状态下进行。 ##### 2. 外部高速时钟(HSE)的配置 ```c RCC->CR |= 0x00010000; // 外部高速时钟使能HSEON while (!(RCC->CR >> 17)); // 等待外部时钟就绪 ``` 以上代码片段实现了HSE的使能,并通过循环等待HSE就绪。这里的关键是`0x00010000`位,它是RCC时钟控制寄存器(RCC_CR)中的HSEON位。一旦HSEON被设置,HSE振荡器就开始启动,并通过循环等待`RCC->CR >> 17`位变为1来确认HSE已经稳定。 ##### 3. APB与时钟分频的配置 ```c RCC->CFGR = 0X00000400; // APB1=DIV2;APB2=DIV1;AHB=DIV1; ``` 此段代码用于配置APB与时钟分频。`0X00000400`表示将APB1总线的频率设置为系统时钟频率的一半,而APB2总线和AHB总线的频率则与系统时钟相同。 ##### 4. PLL配置 接下来是对PLL进行配置。PLL是STM32中一个非常重要的时钟源,可以用来提高系统的运行速度。配置PLL需要设置其输入时钟源、倍频系数等参数。 ```c PLL -= 2; // 抵消2个单位 RCC->CFGR |= PLL << 18; // 设置PLL值2~16 RCC->CFGR |= 1 << 16; // 由软件置’1’或清’0’来选择PLL输入时钟源 ``` 其中`PLL -= 2;`是因为倍频系数从2开始,但寄存器值从0开始,所以需要减去2。接着,通过设置RCC_CFGR寄存器中的相应位,来指定PLL的输入时钟源和倍频系数。 ##### 5. FLASH延迟周期的配置 ```c FLASH->ACR |= 0x32; // FLASH2个延时周期 ``` 这里配置了FLASH访问延迟周期,以适应更高的CPU时钟频率。 ##### 6. PLL的使能与锁定 ```c RCC->CR |= 0x01000000; // PLLON while (!(RCC->CR >> 25)); // 等待PLL锁定 ``` 通过设置RCC_CR寄存器中的PLLON位来使能PLL,并通过循环等待PLL锁定。 ##### 7. 选择PLL作为系统时钟 ```c RCC->CFGR |= 0x00000002; // PLL作为系统时钟 ``` 这一步是将PLL输出设置为系统时钟。 ##### 8. 确认PLL作为系统时钟 ```c while (temp != 0x02) { temp = RCC->CFGR >> 2; temp &= 0x03; } ``` 这部分代码用于确认PLL已经被成功设置为系统时钟。`temp`变量存储了RCC_CFGR寄存器的高位移位后的值,然后通过与运算`temp &= 0x03`来保留低位的SWS[1:0]位,从而判断系统时钟的状态。如果`temp`的值为`0x02`,即SWS[1:0]的值为`10`,则表示PLL已经成功成为系统时钟。 #### 三、总结 通过上述分析可以看出,STM32系统时钟初始化涉及到多个关键步骤,包括外部时钟的使能、APB与时钟分频的配置、PLL的配置及使能、FLASH延迟周期的配置以及最终确认PLL作为系统时钟的成功设置。这些步骤确保了STM32能够以最优的性能运行。