基于野火的STM32学习笔记——RCC系统时钟
前言
新年后在家疯狂摸鱼。。。然后就把之前学的忘了。。。
所以就赶紧写几篇博客恢复一下记忆 orz
一、时钟的理解
时钟是一个单片机的心脏与脉搏,就像心脏跳动时,血液才能循环流动一样,当时钟跳动(震荡)时,单片机内部的代码才能正常运行。每句代码的运行时间一般是输出的震荡频率取反(不详细展开)。
二、时钟工作框图
工作流程图
为便于讲解,讲流程图用不同颜色圈起来。
红色部分位
即为系统产生震荡的来源。有内部RC振荡器产生震荡频率的LSI和HSI,同时也有外部晶振产生频率的HSE和LSE。
HSE:可由4-16Mhz的外部晶振产生信号。且其精度较高,作为各类总线的主要输出信号源。
LSE:LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为*实时时钟(RTC)*或者其他定时功能提供一个低功耗且精确的时钟源。
HSI:HSI时钟信号由内部8MHz的RC振荡器产生,其功能与HSE功能相似,但因其精度较差。常作为HSE出问题后的备用晶振。
LSI:
LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。
—— (stm32f10x中文手册)
黄色部分位
黄色圆圈部分位为PLL,其可在途中所圈位置下通过分或乘控制晶振所传来的频率。
黄色下划线部分为PLLCLK,即经过PLL分屏后得到的时钟。
PLL相关设置因子在RCC_CR(时钟控制寄存器)和RCC_CFGR(时钟配置寄存器)中,如图:
PLLON:PLL使能,1为使能,0为关闭
PLLRDY:只读,读取该位,为1时PLL功能开启状态,为0时PLL功能关闭状态
PLLSRC: 选择PLL输入时钟源。只能在关闭PLL时才能写入此位。
0: HSI振荡器时钟经2分频后作为PLL输入时钟
1: HSE时钟作为PLL输入时钟。
PLLMUL:设置PLL倍频系数。只能在关闭PLL时才能写入此位
0000: PLL 2倍频输出 1000: PLL 10倍频输出
0001: PLL 3倍频输出 1001: PLL 11倍频输出
0010: PLL 4倍频输出 1010: PLL 12倍频输出
0011: PLL 5倍频输出 1011: PLL 13倍频输出
0100: PLL 6倍频输出 1100: PLL 14倍频输出
0101: PLL 7倍频输出 1101: PLL 15倍频输出
0110: PLL 8倍频输出 1110: PLL 16倍频输出
0111: PLL 9倍频输出 1111: PLL 16倍频输出
PLLXTPRE: 分频HSE后作为PLL输入时钟。只能在关闭PLL时才能写入此位。0: HSE不分频 ,1: HSE 2分频
蓝色部分位
蓝色圆圈部分位:通过寄存器选择传入时钟将其转化为系统时钟(sysclk)。
蓝色横线部分位:SYSCLK系统时钟。
SW由时钟配置寄存器(RCC_CFGR)的1,0位控制
SW:选择系统时钟SYSCLK。
00: HSI作为系统时钟;01: HSE作为系统时钟;
10: PLL输出作为系统时钟;11:不可用。
若CSS检测到HSE时钟出现问题时,则强制使HSI作为系统时钟SYSCLK!
绿色部分位
绿色部分位三种总线分频,分别为AHB,APB1,APB2。
AHB的时钟(HCLK)分频可由时钟配置寄存器(RCC_CFGR)的HPRE[3:0]控制。图中线上大部分时钟都为AHB分频后的时钟(HCLK)。
APB2的时钟(PCLK2)由AHB的时钟(HCLK)分频得到,由时钟配置寄存器(RCC_CFGR)的PPRE2[2:0]控制。
APB1的时钟(PCLK1)由AHB的时钟(HCLK)分频得到,由时钟配置寄存器(RCC_CFGR)的PPRE1[2:0]控制。HCLK1 属于低速的总线时钟,最高为 36M。
HPRE:AHB预分频
当AHB时钟的预分频系数大于1时,必须开启预取缓冲器。
0xxx: SYSCLK不分频
1000: SYSCLK 2分频 1100: SYSCLK 64分频
1001: SYSCLK 4分频 1101: SYSCLK 128分频
1010: SYSCLK 8分频 1110: SYSCLK 256分频
1011: SYSCLK 16分频 1111: SYSCLK 512分频
PPRE1:APB1预分频
警告:软件必须保证APB1时钟频率不超过36MHz。
0xx: HCLK不分频
100: HCLK 2分频
101: HCLK 4分频
110: HCLK 8分频
111: HCLK 16分频
PPRE2:APB2预分频
0xx: HCLK不分频
100: HCLK 2分频
101: HCLK 4分频
110: HCLK 8分频
111: HCLK 16分频
各设备时钟
常见
由图可知
在APB2总线上的外设,遵循PCLK2的时钟。
在APB1总线上的外设,遵循PCLK1的时钟。
在AHB总线上的外设,遵循HCLK的时钟。
特殊
不在三种总线上的设备通常使用其它时钟,如图中粉色所圈。
USB时钟(USBCLK):直接用PLL时钟经USB预分频固定为48Mhz的频率作为时钟。
RTC时钟(RTCCLK):用LSE震荡信号经过RTCSEL[1,0] (备份域控制寄存器 (RCC_BDCR)中) 选择后得到。
独立看门狗时钟(IWDGCLK):直接用LSI震荡产生。
外设时钟(I2S2CLK&I2S3CLK):由系统时钟SYSCLK直接产生。