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时,允许以下更新事件产生中断
- 计数器溢出
- TIMx_EGR.UG=1
- 来自从模式控制器
- 如果设置寄存器TIMx_CR1.URS = 1时,允许以下更新事件产生中断
- 计数器溢出
如果TIMx_CR1.UDIS = 1,就是禁止产生更新事件,所以当更新事件不会发生时,也就不会产生任何更新中断。
用以下表格来描述这几者之间的关系
| TIMx_CR1.ARPE | TIMx_CR1.URS | TIMx_CR1.UDIS |
加载到 影子寄存器 | 更新中断 |
| 0 | x | x | 立即 | |
| 1 | x | 0 |
计数器溢出 UG=1 从模式控制器 | |
| 1 | x | 1 | 不能加载 | |
| x | 0 | 0 |
计数器溢出 UG=1 从模式控制器 | |
| x | 1 | 0 | 计数器溢出 | |
| x | x | 1 | 无 |
1839

被折叠的 条评论
为什么被折叠?



