STM32单片机:定时器重载,更新事件,更新中断

STM32系列单片机内部的这几种定时器:基本定时器,通用定时器,高级控制定时器。这几种定时器都具备了一些相同的功能,就是定时器重载,更新事件,更新中断。这几个功能相互交叉,相互影响,本文来厘清这几者之间的关系。

这几种定时器都有这样几个寄存器:

  • 计数器寄存器(TIMx_CNT):对输入时钟进行计数
  • 自动重新加载寄存器(TIMx_ARR)
  • 预分频器寄存器(TIMx_PSC):用于将时钟频率除以1到65536之间的任何因子

其中对于自动重新加载寄存器(TIMx_ARR),预分频器寄存器(TIMx_PSC)这2个寄存器,定时器内部还隐藏着与之相对应的2个影子寄存器,姑且称之为TIMx_ARR_shadow,TIMx_PSC_shadow。这2个影子寄存器对于我们用户来说是不可见的,无法对其进行读写操作。定时器工作时,是以这2个影子寄存器的值为依据的。那么用户怎么将数据写入对应的影子寄存器呢?主要是通过以下的途径:


当寄存器TIMx_CR1.ARPE = 0

表示立即加载,即当用户写入寄存器TIMx_ARR,TIMx_PSC的值,对应的影子寄存器TIMx_ARR_shadow,TIMx_PSC_shadow也被同步写入。


当寄存器TIMx_CR1.ARPE = 1

表示预加载,即当用户写入寄存器TIMx_ARR,TIMx_PSC的值,不会影响影子寄存器的值。等待某个更新事件发生时,再将预先存储在TIMx_ARR,TIMx_PSC中的数据加载到与其对应的影子寄存器TIMx_ARR_shadow,TIMx_PSC_shadow中。

因为加载的前提是有更新事件发生来驱动加载这个动作。所以首先就需要允许更新事件的发生,设置寄存器TIMx_CR1.UDIS = 0,即允许更新事件发生,当发生以下事件时会将TIMx_ARR,TIMx_PSC的值加载到对应的影子寄存器TIMx_ARR_shadow,TIMx_PSC_shadow中:

  • 计数器溢出
  • TIMx_EGR.UG=1
  • 来自从模式控制器

下面再讨论下定时器的更新中断,如果要让定时器产生更新中断,那么要做如下设置:

  • 设置寄存器TIMx_DIER.UIE=1,即允许更新中断。
  • 设置寄存器TIMx_CR1.UDIS = 0,即允许更新事件发生
  • 如果设置寄存器TIMx_CR1.URS = 0时,允许以下更新事件产生中断
  1. 计数器溢出
  2. TIMx_EGR.UG=1
  3. 来自从模式控制器
  • 如果设置寄存器TIMx_CR1.URS = 1时,允许以下更新事件产生中断
    1. 计数器溢出

    如果TIMx_CR1.UDIS = 1,就是禁止产生更新事件,所以当更新事件不会发生时,也就不会产生任何更新中断。


    用以下表格来描述这几者之间的关系

    TIMx_CR1.ARPETIMx_CR1.URSTIMx_CR1.UDIS

    加载到

    影子寄存器

    更新中断
    0xx立即
    1x0

    计数器溢出

    UG=1

    从模式控制器

    1x1不能加载
    x00

    计数器溢出

    UG=1

    从模式控制器

    x10计数器溢出
    xx1

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    打赏作者

    btzhy

    您的鼓励是我最大的动力!

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

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

    打赏作者

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

    抵扣说明:

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

    余额充值