本文仅为学习笔记,内容大量参考《STM32F1开发指南-库函数版本_V3.3》
(1)
为什么
STM32
要有多个时钟源呢?
STM32
的时钟系统比较复杂,不像简单的
51
单片机一个系统时钟就可以解决一切。
采用一个系统时钟不是很简单吗?为什么
STM32
要有多个时钟源呢?
因为并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。
(2)
STM32时钟源
五个时钟源,分别为
HSI
、
HSE
、
LSI
、
LSE
、
PLL
。
①、
HSI
是高速内部时钟,
RC
振荡器,频率为
8MHz
。
②、
HSE
是高速外部时钟,可接石英
/
陶瓷谐振器,或者接外部时钟源,频率范围为
4MHz~16MHz
。我们的开发板接的是
8M
的晶振。
③、
LSI
是低速内部时钟,
RC
振荡器,频率为
40kHz
。独立看门狗的时钟源只能是
LSI
,同
时
LSI
还可以作为
RTC
的时钟源。
④、
LSE
是低速外部时钟,接频率为
32.768kHz
的石英晶体。这个主要是
RTC
的时钟源。
⑤、
PLL
为锁相环倍频输出,其时钟输入源可选择为
HSI/2
、
HSE
或者
HSE/2。倍频可选择2~16
倍,但是其输出频率最大不得超过
72MHz
。
(3)5 个时钟源是怎么给各个外设以及系统提供时钟的呢?
A. MCO 是
STM32
的一个时钟输出
IO(PA8)
,它可以选择一个时钟信号输出,可以选择为 PLL
输 出的
2
分频、
HSI
、
HSE
、或者系统时钟。这个时钟可以用来给外 部其他系统提供时钟源。
B. 这里是 RTC
时钟源,从图上可以看出,
RTC
的时钟源可以选择
LSI
,
LSE
,以及HSE 的
128
分频。
C. 从图中可以看出 C
处
USB
的时钟是来自
PLL
时钟源。
STM32
中有一个全速功能的 USB
模 块,其串行接口引擎需要一个频率为
48MHz
的时钟源。该时钟源只能从 PLL
输出端获取,可 以选择为
1.5
分频或者
1
分频,也就是,当需要使用
USB模块时,PLL
必须使能,并且时钟频 率配置为
48MHz
或
72MHz
。
D. D 处就是
STM32
的系统时钟
SYSCLK
,它是供
STM32
中绝大部分部件工作的时钟源。系统 时钟可选择为 PLL
输出、
HSI
或者
HSE
。系统时钟最大频率为
72MHz
,当然你也可以超频, 不过一般情况为了系统稳定性是没有必要冒风险去超频的。
E. 这里的 E
处是指其他所有外设了。从时钟图上可以看出,其他所有外设的时钟最 终来源都是 SYSCLK
。
SYSCLK
通过
AHB
分频器分频后送给各模块使用。这些 模块包括:
①、
AHB
总线、内核、内存和
DMA
使用的
HCLK
时钟。
②、通过
8
分频后送给
Cortex
的系统定时器时钟,也就是
systick
了。
③、直接送给
Cortex
的空闲运行时钟
FCLK
。
④、送给
APB1
分频器。
APB1
分频器输出一路供
APB1
外设使用
(PCLK1
,最大频率 36MHz)
,另一路送给定时器
(Timer)2
、
3
、
4
倍频器使用。
⑤、送给
APB2
分频器。
APB2
分频器分频输出一路供
APB2
外设使用
(PCLK2
,
最大频率
72MHz)
,另一路送给定时器
(Timer)1
倍频器使用。
![](https://i-blog.csdnimg.cn/blog_migrate/40ddc587e7557129fffcd96e5d97de52.png)
其中需要理解的是
APB1
和
APB2
的区别,
APB1
上面连接的是低速外设,包括电源接口、
备份接口、
CAN
、
USB
、
I2C1
、
I2C2
、
UART2
、
UART3
等等,
APB2
上面连接的是高速外设包
括
UART1
、
SPI1
、
Timer1
、
ADC1
、
ADC2
、所有普通
IO
口
(PA~PE)
、第二功能
IO
口等。居宁
老师的《稀里糊涂玩
STM32
》资料里面教大家的记忆方法是
2>1
,
APB2
下面所挂的外设的时
钟要比
APB1
的高。
(4)为什么使用外设时需要先使能对应的时钟?
在以上的时钟输出中,有很多是带使能控制的,例如
AHB
总线时钟、内核时钟、各种
APB1
外设、
APB2 外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。
(5)设置时钟要做到心中有数
STM32
时钟系统的配置除了初始化的时候在
system_stm32f10x.c
中的
SystemInit()
函数中外,其他的配置主要在 stm32f10x_rcc.c
文件中,里面有很多时钟设置函数,大家可以打开这个文件浏览一下,基本上看看函数的名称就知道这个函数的作用。在大家设置时钟的时候,一定要仔细参考 STM32
的时钟图,做到心中有数。这里需要指明一下,对于系统时钟,默认情况下是在 SystemInit
函数的
SetSysClock()
函数中间判断的,而设置是通过宏定义设置的。
总结:就是要对时钟系统有个大致的认识,实际应用时若是有涉及,一定要参考时钟图,做到心中有数。