首页 > 其他 > 详细

13. Advanced-control timers (TIM1 and TIM8)

时间:2020-04-17 16:26:20      阅读:90      评论:0      收藏:0      [点我收藏+]

技术分享图片

1. 基本介绍

有三个基础的寄存器:

  • 计数寄存器(TIMx_CNT,Counter register)
  • 预分频寄存器(TIMx_PSC,Prescaler register)
  • 自动重载寄存器(TIMx_ARR,Auto-reload register)
  • 重复计数寄存器(TIMx_RCR,Repetition counter register),当前频率下你需要比CNT更大的计数值时,可以使用。

计数器运行在TIMx_PSC预分频后的CK_CNT,前提是TIMx_CR1 寄存器里的CEN(Counter enable)位是1。只要CEN是1,计数器就开始计数。

如果TIMx_CR1 寄存器里的ARPE(Auto-reload Enable)位是1的话,在每次更新事件(UEV,update event)发生的时候TIMx_ARR寄存器的数值就会装载到计数器内;否则的话,只装载1次。

 

1.1 TIMx_PSC,Prescaler register

预分频,即预分频的比率:就是将原来的(n+1)个CK_PSC信号视为1个时钟信号。所以实际上,计数器的时钟信号频率CK_CNT = fCK_PSC / (PSC[15:0] + 1)。

你可以在任意时刻修改TIMx_PSC,但是只有在UEV事件发生时,新的预分频比率才会被使用:

技术分享图片

这里可以看出与预分频相关的有3个寄存器:

  • PSC,用于写入新的分频比率
  • buffer,当前预分频计数器的上限,一般来自PSC,主要看什么时刻更新。
  • counter,当前预分频计数器的值

 

1.2 TIMx_ARR,Auto-reload register

自动重载寄存器,和它相关的主要是要不要缓存TIMx_ARR。

 

当TIM1_CR1寄存器里的ARPE(Auto-reload preload enable)位是0时, TIMx_ARR不会被缓冲,所以会被立即更新:

修改TIMx_ARR -> 立即修改自动重载的预加载寄存器 -> 立即更新自动重载的影子寄存器

技术分享图片

 

当TIM1_CR1寄存器里的ARPE(Auto-reload preload enable)位是1时, TIMx_ARR会被缓冲,所以不会被立即更新:

修改TIMx_ARR -> 立即修改自动重载的预加载寄存器 -> 在UEV事件时更新自动重载的影子寄存器

技术分享图片

1.3 计数模式

1.3.1 向上计数,Upcounting mode

此模式下,计数器从0加到TIMx_ARR,然后触发一个overflow事件并从0开始重新计数。

 

UEV事件的触发与否:

  • 如果使用了TIMx_RCR,当计数器重复了(TIMx_RCR+1)遍时会触发UEV事件,否则在每次的overflow会触发UEV事件。
  • 设置TIM1_EGR寄存器里的UG(Update generation)位会触发UEV事件
  • 如果TIMx_CR1 寄存器里的UDIS( Update disable)位是1时,不会触发UEV事件。
  • 如果TIMx_CR1 寄存器里的URS(Update request source)位是1时,虽然UEV事件会发生,但是不会触发中断:不会置位对应的UIF标志位

 

当UEV事件发生时,会造成:

  • 更新TIMx_SR寄存器的状态标志位UIF(Update interrupt flag),前提是TIMx_CR1 寄存器里的URS(Update request source)位是0
  • 重新初始化TIMx_CNT:如果DIR=1(向下计数)就从TIMx_ARR寄存器重载;否则(DIR= 0,即向上计数;或者中心对齐模式)计数器清零。
  • 更新预分频buffer为TIMx_PSC,预分频计数器清零。
  • 更新自动重载计数器的shadow为TIMx_ARR

 

13. Advanced-control timers (TIM1 and TIM8)

原文:https://www.cnblogs.com/qiyuexin/p/12720617.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!