STM32学习笔记1:STM32 时钟系统

本文仅为学习笔记,内容大量参考《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 倍频器使用。

 

其中需要理解的是 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() 函数中间判断的,而设置是通过宏定义设置的。
总结:就是要对时钟系统有个大致的认识,实际应用时若是有涉及,一定要参考时钟图,做到心中有数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不做拖延王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值