最近终于重新捡起积灰的开发板…继续做点学习记录

主要包括几个部分:时钟输入,锁相环倍频,总线分频。寄存器主要用到时钟控制寄存器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两个位HSIONHSIRDY进行设置和判断。

二、锁相环倍频

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

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 系统时钟配置

发表回复