STM32 系统时钟配置
最近终于重新捡起积灰的开发板…继续做点学习记录
主要包括几个部分:时钟输入,锁相环倍频,总线分频。寄存器主要用到时钟控制寄存器RCC_CR和时钟配置寄存器RCC_CFGR。
一、时钟输入
1. HSE外部高速时钟
频率范围为4MHz~16MHz,通常为8MHz,由OSC_OUT和OSC_IN引脚进入。
在代码上通过时钟控制寄存器RCC_CR来控制,具体而言,通过寄存器RCC_CR位HSEON使能;HSE需要起振,通过寄存器RCC_CR位HSERDY判断HSE是否稳定,即是否准备完毕。
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY; //Get state of HSERDY
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
随后会通过一个分频模块,通过时钟配置寄存器RCC_CFGR位PLLXTPRE设置是否进行2分频(0: 否 1: 是),通常选择不分频,即位PLLXTPRE置0。
最后HSE时钟接入锁相环时钟输入端。
2. HSI内部高速时钟
通常为RC振荡器,频率为8MHz,产生后会先进行2分频,即以4MHz接入到锁相环时钟输入端。与HSE类似,HSI也需要起振,通过寄存器RCC_CR两个位HSION和HSIRDY进行设置和判断。
二、锁相环倍频
HSE和HSI稳定并接入电路后,通过一个选择器选择其中之一作为时钟源,接着进入倍频模块,得到锁相环时钟输出PLLCLK。
在代码上通过时寄存器RCC_CFGR来控制,具体而言,通过位PLLSRC选择;通过字段PLLMUL设置倍频因子。
一般情况下,因为HSI根据温度和环境的情况频率会有漂移,一般不作为时钟源,所以设置时钟源为HSE,倍频因子为9,即得到PLL时钟:PLLCLK = 8M *9 = 72MHz。
三、总线分频
在得到总线时钟之前,还有一个系统时钟SYSCLK,也可以选择来源,分别是HSI、PLLCLK、HSE。通过寄存器RCC_CFGR字段SW设置。一般情况下设置系统时钟:SYSCLK=PLLCLK =72MHz。通过寄存器RCC_CFGR位SWS判断切换状态,即是否切换完成。
SYSCLK 经过 AHB 预分频器分频之后得到时钟叫 AHB 总线时钟,即 HCLK,具体由寄存器RCC_CFGR字段HPRE设置。片上外设的大部分时钟都是由HCLK分频得到。一般来说,AHB分频因子设置为1,即HCLK=SYSCLK=72MHz。
1.APB2总线时钟 PCLK2
由 HCLK 经过APB2预分频器得到,分频因子具体由RCC_CFGR字段PPRE2决定,PCLK2属于高速总线时钟,片上高速的外设就挂载到这条总线上,比如GPIO、USART1、SPI1等。一般设置为1 分频,即 PCLK2 = HCLK = 72MHz。
2.APB1总线时钟 PCLK1
由 HCLK 经过低速 APB1 预分频器得到,分频因子具体由RCC_CFGR字段PPRE1决定。PCLK1 属于低速总线时钟,最高为36MHz,片上低速的外设就挂载到这条总线上,比如 USART2/3/4/5、SPI2/3,I2C1/2 等。一般设置为2 分频,即 PCLK1 = HCLK/2 = 36MHz。
四、其他时钟
以上就是主要使用到的时钟源,除此之外还有一些低速的时钟:低速外部时钟LSE、低速内部时钟LSI、MCO(与LSE相接)。
LSE,一般为32.768kHz。LSI,频率为40kHz。
RTC(Real Time Clock)时钟,时钟源除了LSE和LSI输入外,还有一个输入源是HSE时钟的128分频。通过寄存器 BDCR 字段RTCSEL配置。RTC主要用于实时计时。
独立看门狗的时钟由 LSI 唯一提供。
MCO(microcontroller clock output)微控制器时钟输出,在 STM32 F1 系列中由 PA8 复用所得,主要用于对外提供时钟,时钟来源可以是:PLLCLK/2、HSI、HSE、SYSCLK。具体选哪个由寄存器CFGR字段MCO决定。主要可用于监控片上时钟。
作者:ayamee