STM32学习笔记:时钟系统
一.时钟系统5个时钟源
HSI高速内部时钟
HSE高速外部时钟
LSI低速内部时钟
LSE低速外部时钟
PLL锁相环时钟
二.主系统时钟介绍
1.HSE(High Speed External Clock signal)时钟
高速的外部时钟
产生:无源晶振加两个电容辅助起振(4~16M),一般选用8M
作用:一般选用都是HSE
控制位:由RCC_CR(时钟控制寄存器)的 位16(HSEON)控制
2.HSI(High Speed Internal Clock signal)时钟
高速的内部时钟
产生:芯片内部(8M)
作用:当HSE故障时,系统时钟会自动切换到HSI,直至HSE启动成功
控制位:由RCC_CR(时钟控制寄存器)的 位0(HSION)控制
3.PLLCLK时钟
锁相环时钟
产生:HSI/2、HSE经过倍频所得,可以选择2~16倍频
控制位:由RCC_CFGR(时钟配置寄存器)的PLLXTPRE和PLLMUL控制
4.SYSCLK时钟
系统时钟
产生:HSE.HSI.PLLCLK
控制位:由RCC_CFGR(时钟配置寄存器)的SW控制
注意:一般配置SYSCLK = PLLCLK = 72M
5.HCLK时钟
AHB(advanced high-performance bus)高速总线时钟
产生:SYSCLK分频得到的
作用:为AHB总线的外设提供时钟,为Cortex系统定时器提供时钟(SysTick),为内核提供时钟(FCLK)
控制位:由RCC_CFGR(时钟配置寄存器)的HPRE控制
注意:一般配置HCLK = SYSCLK = 72M
6.PCLK1时钟
APB1低速总线时钟
产生:HCLK分频得到的
作用:为APB1总线的外设提供时钟,2倍频后为APB1总线定时器2~7提供时钟
控制位:由RCC_CFGR(时钟配置寄存器)的PPRE1控制
注意:一般配置PCLK1 = HCLK/2 = 36M
6.PCLK2时钟
APB2低速总线时钟
产生:HCLK分频得到的
作用:为APB2总线的外设提供时钟,为APB2总线定时器1和8提供时钟
控制位:由RCC_CFGR(时钟配置寄存器)的PPRE2控制
注意:一般配置PCLK2 = HCLK = 72M
7.RTC时钟
产生:HSE分频、LSE(外部低速时钟)、LSI(内部低速时钟)
作用:为芯片内部的RTC外设提供时钟
控制位:由RCC_BDCR(RCC备份域控制寄存器)的RTCSEL控制
8.IWDGCLK时钟
独立看门狗时钟
产生:由LSI提供
三.72M系统时钟配置过程
由8M HSE时钟开始,经过PREDIV1SCR选择,进入PREDIV1进行预分频在这里选择1分频,此时 8/1=8M,再经过PLLSCR选择,进入PLLMUL进行倍频在这里选择9倍频,此时 8*9=72M,输出形成PLLCLK(锁相环时钟),在SW选择PLLCLK,所以SYSCLK=PLLCLK=72M.
void SetSysClockTo72M(void) //非官方系统时钟初始化函数
{
ErrorStatus HSEStatus;
/*把RCC寄存器复位*/
RCC_DEInit();
/*使能HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/*等待HSE启动*/
HSEStatus = RCC_waitForHSEStartUp();
if(HSEStatus == SUCCESS)
{
/*使能预取指*/
FLASH_PrefetchBUfferCmd(FLASH_PrefetchBUffer_Enable); //预取指缓存使能
FLASH_SetLatency(FLASH_Latency_2); //预取指2个延时周期
/*配置其他时钟*/
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB的时钟HCLK,由SYSCLK 1分频得到
RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1的时钟PCLK1,由HCLK 2分频得到
RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2的时钟PCLK2,由HCLK 1分频得到
/*配置 PLLCLK = HSE *RCC_PLLMul_9R*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//这里RCC_PLLMul_x的x的取值为2~16
/*使能PLL*/
RCC_PLLCmd(ENABLE);
/*等待PLL稳定*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/*选择系统时钟*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*等待系统时钟稳定*/
while(RCC_GetSYSCLKSource != 0x08);
}
else
{
/*启动失败,用户自行添加处理代码*/
}
}
四.xM系统时钟配置过程
只需将上述的72M系统时钟配置过程的
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
换成
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x); //x的取值为2~16
统时钟配置过程的
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
换成
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x); //x的取值为2~16
即可