STM32定时器和时钟树详细图文讲解,小白必会!

本文对b站的教学视频内容进行总结和理解,用作学习记录和助力大家理解。

目录

定时器

时钟树


定时器

定时器本质是计数器!
定时器本质是计数器!
定时器本质是计数器!

重要的事情说三遍!!!

那怎么才能实现计时呢,没错就是“数数”。

在电路中有一个恒定频率的方波信号加上一个寄存器,当恒定信号的上升沿到达,寄存器存储的数就加1,就可以实现计时。
比如方波信号的频率是100Hz,也就是1秒100个脉冲,那么寄存器的值累加到100时,时间就过去1秒钟。

但是定时器中的计数器(也就是上面的寄存器)的长度仅有16bit,所以最多能记65536个数。

假设时钟源信号(即上面的方波信号)频率为72MHz的话,数65536个数也才
65536 /  72000000=0.0009秒,这时间实在是太少了。

所以在定时器的计数器前又加了一个预分频器预分频器通过计数来进行分频,本质上也是一个计数器。

当预分频器设置为0时,相当于数0,每一个上升沿都被记录,进入预分频器的脉冲信号会原封不动的被输出给寄存器;当预分频器设置为1时,相当于数0,1,进入预分频器的脉冲信号会间隔一个被输出给寄存器,达到了2分频。
因此想进行n分频可以将预分频器设置为n-1,预分频器长度也是16bit,可以计数65536,那么72MHz的时钟输入下,可以计时65536*65536/72000000=59.65秒。如果觉得时间还不够长,可以用一个定时器的输出作为另一个定时器的输入。

通过预分频器和计数器的组合,已经可以实现计时(不是定时),那么如何实现定时呢?比如每隔一分钟发一次数据。
这个时候就需要自动重装载寄存器

自动重装载寄存器的作用是实时监控计数器的值和自己的值是否相同,一旦相同便将计数器的值置0,并且可以根据我们的设置,在计数器的值重置为0时触发一个事件或者中断,这样就可以定时的去做一些事情。

U是时间,UI是中断。

需要注意的是,跟预分频器一样,自动重装载寄存器从0开始计数,想定时m个脉冲的话,要设置为m-1。

还有两个补充的知识点。

预分频器有个叫做“影子寄存器”的结构,真正工作在分频一线的是影子寄存器,预分频器是幕后boss。
假设预分频器预影子寄存器的初始值都为7199,当设置预分频器值为2333时,影子寄存器不会马上变为2333,而是等计数器预自动重装载寄存器的值相等,计数器置0时,影子寄存器的值才为2333。简单来说我们设置的新预分频值要等到下个计数周期才会生效。

这样的好处是什么呢?
举个例子来说,假设需要让定时器每1毫秒产生一个中断信号,其中使用了一个计数器和一个预分频器,计数器的初始值为0,预分频器的初始值为7199(对应1秒钟的计数周期)。如果需要将预分频器的值修改为71(对应1毫秒钟的计数周期),直接将新值写入预分频器中可能会导致计数器在修改前后存在不一致的情况,从而无法实现所需的精度要求。这时候可以引入影子寄存器,先将新的预分频器值写入影子寄存器中,等待计数器达到自动重装载寄存器的值时再将新的值加载到预分频器中,以确保更新操作的同步性和稳定性。

重装载寄存器也有个影子寄存器,也是让我们设置的从装载值在下个计数周期生效。

假设当前自动重装载寄存器的值为9999,如果立刻变成100,而此时计数器的值累加到102,超过了100,便无法重置为0也无法触发中断,只能等计数器记到65535才能重置为0,那这样就出现了时间的误差。因此自动重装载寄存器需要把100在下个周期赋值给影子寄存器,等下个周期开始生效。

时钟树

经常听说STM32的时钟源,那么为什么单片机离开了时钟源这颗心脏就无法存活呢?

本质是逻辑门内部的运算涉及了MOS管的充放电过程,比电流的速度慢,容易导致“竞争冒险”。

比如图中异或门的输入为0和1,输出应该为1(变成黄色),但是逻辑门内部还在运算,目前还是上次的结果0,这就产生了错误状态。
那怎么规避这个问题呢,需要在异或门后面加上一个边沿触发器(包括一个输入端,一个控制端,一个输出端),其特性是当控制端出现一个低电平变成高电平的上升沿时,输出端会变成输入端的电平,其他时候不管输入端是什么,都保持不变。
为控制端接入一个恒定频率的方波信号,在这个信号的一个周期内,门电路执行运算产生的任何副作用都不会影响寄存器的值。

我理解时钟的作用也就是等一等,等所有计算都结束,稳定了再把信号输入给寄存器,因此有时候时钟频率不能设置的太高,可能逻辑门还没运算完。

接下来看一下时钟树图

相信各位新手经常看到这样的图无从下手,比如我。网上有大佬做了便于理解的简化图,如下:

这个看起来也无从下手,没事,下面还有抽象的讲解逻辑图。
讲解的起点从上上图红框中的AHB总线开始。

在STM32芯片内部有一个叫做AHB(先进高性能总线)的总线结构,理解成STM32中的主干道。
其中的处理器、内存、DMA以及各种外设都连接在AHB总线上进行数据通信,HCLK就是这总线的时钟线,类似于IIC总线中的SCL时钟线。
HCLK直接连入了处理器内存和DMA,为它们带来时钟信号。所以上述简化树图的内核、内存和DMA直接连接在HCLK上,如果HCLK的频率是72MHz,那么内核、内存和DMA也是相同的72MHz
在处理器内核中,有一个SysTick(系统滴答)的定时器为程序提供时间基准,比如程序中的Delay延时函数。SysTick并不是与HCLK直连,而是经过一个分频器(和预分频器不一样,预分频器通过计数进行分频,分频器不是)。分频器的作用就是降低频率,如果HCLK是72MHz,分频器设置/1,那么SysTick频率为72MHz,如果分频器设置/8,那么SysTick频率为9MHz。简化树图上也可以看到该定时器。

在STM32芯片中,像GPIO、IIC、串口等外设并没有直接连接在AHB总线上,而是分别连接到两个APB(先进外设总线)总线上,原因如下:

  1. 优化功耗:将所有外设都直接连接到主总线会导致功耗过高,因为外设通常并不需要与CPU进行持续的高速数据传输。通过将外设连接到专门的总线,可以灵活地控制外设的访问和功耗。

  2. 降低总线负载:如果所有外设都连接到主总线,可能会导致总线拥堵,影响系统性能。通过使用专门的总线连接外设,可以减轻主总线的负荷,提高系统整体的性能。

  3. 提高系统的可扩展性:将外设连接到专门的总线可以使系统更容易扩展和升级,因为可以灵活地添加新的外设而无需改动主总线结构。

  4. 简化硬件设计:通过将外设连接到专门的总线,可以使硬件设计更加简单和灵活,降低系统成本并提高可靠性。

APB1和APB2这两个总线通过桥接器连接到AHB总线,与连接在AHB总线上的部分进行通信。
APB1和APB2分别连接了什么外设可以从简化树图以及抽象图中看到,这两个总线的时钟线从抽象图可以看到来自HCLK。

APB1时钟线上,有一个可以设置的预分频器进行分频,分频后的时钟信号称为PCLK1,提供给了除定时器外的其它外设(从抽象图中可以看到),而定时器前面多了倍频器,用来提升频率。
倍频器有x1和x2两个值,但是不能自己设置,当分频器的值为/1时,倍频器为x1,当分频器的值为/2 /4 /8 /16时,倍频器为x2,以尽可能提升定时器的频率。

APB2有一套一模一样的结构,分频器与倍频器的规则也一样,不同的是ADC有一个专属的分频器ADC需要集采一段时间才能更准确的获取电压值,因此频率需要慢下来,所以没有倍频反而分频

那么HCLK上的时钟频率是怎么来的呢?

从源头上说,这棵以HCLK为核心的时钟树的时钟源有两个——HSI(高速内部时钟)和HSE(高速外部时钟)
HSI是STM32默认使用的时钟源,内置在STM32内部,无需外接电路就可使用,产生的频率是8MHz,比较方便但精度差一些。
HSE需要从外部接入“晶振”元器件,晶振内部有石英晶体,可以发出一定频率的脉冲信号,该学习板上的晶振的信号频率也是8MHz,但精度更高,如下:

HSI和HSE这两个时钟源可以接入到时钟树的SYSCLK(系统时钟)中,简化树图可以看出来。系统时钟会经过一个分频器进入HCLK中,这就是HCLK的时钟频率的来源

但是8MHz的时钟源经过分频器接入HCLK,HCLK的频率只会小于等于8MHz,怎么会有72MHz呢?

于是HSI和HSE还有另外的选择,进入PLL锁相环(理解成倍频器)HSI经过一个/2的分频器进入锁相环,而HSE经过一个/1 /2的分频器进入锁相环。而锁相环可以x2x3一直到x16,因此SYSCLK可以达到72MHz
SYSCLK(系统时钟)在进入HCLK之前会经过一个AHB的分频器,当系统时钟72MHz时,分频器设置为/1,那么HCLK就是72MHz

现在大体上应该都了解了,还有一些细节。

FCLK(自由运行时钟)是干嘛的呢?

当我们为了节省电量,让STM32进入低功耗模式之一的“停止模式”时,AHB总线会停止运行,HCLK停止传输时钟脉冲,所有连接搭配AHB总线上的外设都停止工作
停止之后该怎么重新唤醒呢?唤醒的手段就是靠外部中断,这就依靠FCLK了。
虽然在CubeMx上看,它来自HCLK,但这只是表明它与HCLK的时钟频率同步,它的真正来源是AHB的分频器,从简化图可以看出来。因此在HCLK停止运行时,FCLK依旧可以运行,为中断采样提供时钟信号。

到这边,时钟树的大概讲解就结束了,希望大家都能有所悟。

写的不对的地方请大家多多指正。

  • 37
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值