红叶何时落水
什么是时钟?通俗的的来说,时钟是一个系统的最小时间单位。它并不是用来提供能量的器件,他就像是我们生活中的秒表,以固定的频率一秒一秒的走着。而我们每做一件事都可以说是花费了几秒时间。(不存在零点几秒,它是一个系统的最小时间单位)。
在单片机里面通常有4个时钟源,分别是
HSI
振荡器时钟 (高速内部时钟)8M
HSE
振荡器时钟 (高速外部时钟)外接一个晶振电路
LSI
振荡器时钟 (低速内部时钟)40k
LSE
振荡器时钟 (低速外部时钟)32.768k
其中,一般情况下我们使用外部HSE
振荡器时钟来作为我们的系统时钟。它可以用来驱动APB,DMA,Cortex等系统。
而低速时钟一般用于驱动RTC。
![](https://i-blog.csdnimg.cn/blog_migrate/a0890a1a19b9c4042627b7c3e98a4076.jpeg)
首先,HSI振荡器时钟 (高速内部时钟)8M
从图中可以看到HSI分为两路输出
第一路 直接作为系统时钟输出
此时,系统时钟最大为8M
第二路 2分频后,进入PLL进行倍频,然后再输出
二分频后,8M / 2 = 4M
倍频后 最大倍频倍数为16倍 4M * 16 = 64M
这个时钟源是封装在芯片内部的,由内部8MHz的RC振荡器产生。精度不咋地。
HSE振荡器时钟 (高速外部时钟)4M~16M
我们需要在外部接一个晶体/陶瓷谐振器(HSE晶体)
从图中可以看出它分为了4路输出
第一路 直接作为系统时钟输出,同时会被CSS监控
CSS是时钟安全系统
它的作用是用来监控HSE是否正常工作,一旦HSE出现异常,他会自动将系统时钟切换到HSI,以此来保证系统不会崩溃。
它可以通过软件激活,在HSE启动延时后使能,并与其保持同步。
HSE出事后,会通过高级定时器产生CSSI时钟安全中断。等待NMI处理完成后设置(RCC_CIR)里的CSSC位来清除CSS中断
第二路 和 第三路 直接进入PLL或二分频后进入PLL进行倍频后输出
一般外接8M晶振是,系统会默认是9倍频,系统时钟为72M。
如果想超频的话,理论上改为16倍频,系统时钟为128M。
第四路 128分频后,作为RTC的时钟输出
为什么要128分频呢?低功耗状态下没必要太高时钟。
PLL
倍频倍数的设置在system_stm32f10x文件里面执行,这个文件是在主函数之前执行的,他会配置好系统时钟,这就意味这,系统时钟一旦配置好,就不可以在主函数里面修改。
system_stm32f10x中通过SystemInit()函数来对时钟源进行初始化
首先使能HSI时钟,等到他稳定后,通过
RCC_CR与RCC_CFGR寄存器来对外部时钟和PLL进行配置。
RCC_CR时钟控制寄存器
例如 位0与位1
位0
内部高速时钟使能
当从待机和停止模式返回或用作系统时钟的外部
4-16MHz
振荡器发生故障时,该位由硬件置
’1’
来启动内部
8MHz
的
RC
振荡器。当内部
8MHz
振荡器被直接或间接地用作或被选择将要作为系
统时钟时,该位不能被清零。
0
:内部
8MHz
振荡器关闭;
1
:内部
8MHz
振荡器开启。
位1 内部高速时钟就绪标志
由硬件置
’1’
来指示内部
8MHz
振荡器已经稳定。在
HSION
位清零后,该位需要
6
个内部
8MHz
振
荡器周期清零。
0
:内部
8MHz
振荡器没有就绪;
1
:内部
8MHz
振荡器就绪。
其他位看数据手册,都差不多,使能时钟源
RCC_CFGR时钟配置寄存器
功能为选择到底是用哪个时钟源,以及倍频倍数是多少。上面每一个时钟源都有多路可以选择,但最终只是用一路。这个寄存器就是从中选择一路作为系统时钟。
例如
位
1:0
SW[1:0](就是上面那张图中的竖着放着的梯形(多选一逻辑电路))
:系统时钟切换
(System clock switch)
位
1:0
由软件置
’1’
或清
’0’
来选择系统时钟源。
在从停止或待机模式中返回时或直接或间接作为系统时钟的
HSE
出现故障时,由硬件强制选择
HSI
作为系统时钟
(
如果时钟安全系统已经启动
)
00
:
HSI
作为系统时钟;
01
:
HSE
作为系统时钟;
10
:
PLL
输出作为系统时钟;
11
:不可用。
通过配置上面那些寄存器基本可以将系统时钟完成
剩下的外设时钟便可以在主函数里面配置寄存器完成
其中,APB1和APB2都分为两路,一路用来挂载外设,另一路用来挂载定时器
并且定时器与外设时钟虽然都是由APB分频而来,但其时钟频率并不是一定相同。
例如APB1外设时钟最大为36M,但是TIM2~TIM7这些定时器时钟依旧为72M.
原因为定时器时钟经过了二倍频,而这个二倍频开启的条件就是APB分频系数不是1的时候就开启。APB1为二分频,所以36M*2=72M;APB2为1分频,72M*1=72M;