stm32专题二十五:基本定时器原理

STM32F103系列的定时器:
定时器功能:定时、输入比较、输出捕获、互补输出;
定时器分类:基本定时器、通用定时器、高级定时器;
定时器资源:高级定时器(2个)TIM1 和 TIM8;通用定时器(4个)TIM2 / 3 / 4 / 5;基本定时器(2个)TIM6 和 TIM7;
定时器功能表:

基本定时器功能简介:
  1. 计数器16bit,只能向上计数,只有TIM6和TIM7;
  2. 没有外部的GPIO,是内部资源,只能用来定时;
  3. 时钟来自PCLK1,为72M,可实现1~65536分频;
  • 基本定时器的结构框图:

1 时钟源(72M): 

时基单元

定时器最主要的就是时基部分:包括 预分频器、计数器、自动重装载寄存器。

PSC预分频器写0,1分频,写1,2分频。所以预分频器的值和实际的分频系数相差1,即分频系数=预分频器的值+1。所以计数器时钟CK_CNT=72/(PSC+1)

(1)16位的预分频器 PSC:

PSC预分频器对内部时钟CK_PSC进行分频之后,得到计数器时钟 CK_CNT = CK_PSC / (PSC + 1),这里一定要+1,这是stm32规定,参见寄存器说明描述。

关于预分频器PSC,其实是可以修改分频系数值的(通常不这么做),修改后的值会在达到更新事件后更新。

如我们设置自动重装载值寄存器ARR的值为1000,PSC = 0(实际分频为1),那么应该会在计数满1000个脉冲后产生中断和更新事件;如果我们在中途修改PSC会怎么样?比如,中途把PSC设置为1,它实际上不会立即改变,而是在本次更新事件之后再生效。那么此时的实际效果为:第一次计数1000个脉冲产生中断,第二次计数2000个脉冲产生中断。

计数器CNT在计数器时钟的驱动下开始计数,计数一次的时间为1 / CK_CNT。

实际计数值 = 计数周期 ×(ARR + 1),注意,这里的 + 1和systick一样的理由,因为是循环计数啊,假设我们希望每100次产生中断,那么实际的计数过程是什么样的?

一个计数周期过程:100 → 0 → 100 → 0  → 100...,不断重复。可以看到,从0→100→0才是一个周期,那么就很简单了,0→100计数了100次,而100→0又计数了1次,所以总共计数周期为101个脉冲,因此我们希望值为100的话,要设置ARR = 99。

之前写的关于systick的计数值设置:

(2)计数器、自动重装载值寄存器

定时器使能(CEN 置 1)后,计数器 CNT在CK_CNT 驱动下计数,当 TCNT 值与 ARR 的设定值相等时就自动生成事件并 CNT 自动清零,然后自动重新开始计数,如此重复以上过程。

影子寄存器:

下面是中文参考手册中关于影子寄存器的描述:

时基单元中的TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。 

 

(1)用户程序对TIMx_PSC寄存器值的修改或读取都是操作其预装载寄存器,其修改值只能通过更新事件后才能生效,即从TIMx_PSC的预装寄存器拷贝到TIMx_PSC的影子寄存器。

(2)对于TIM_ARR寄存器的修改或读取,是直接操作影子寄存器还是先操作ARR的预装寄存器,等更新事件后拷贝到影子寄存器呢,这跟一个TIMx_CR1寄存器的ARPE位有关。如果ARPE=0,即不使用ARR的预装功能,则修改TIMx_ARR 寄存器的值就是操作影子寄存器,新的ARR的值立即生效。否则,如果ARPE=1,即使用ARR的预装功能,则修改TIMx_ARR 寄存器的值就是操作预装寄存器,直到发生更新事件后,ARR预装载寄存器的值才被拷贝到影子寄存器中。

APRE = 0时:

APRE = 1时: 

输入捕获和输出比较:

同样,对于TIMx_CCR 的修改和读取跟 TIM_ARR 寄存器的修改或读取类似。是直接操作CCR影子寄存器还是先操作CCR的预装载寄存器,等更新事件后拷贝到影子寄存器呢,这跟一个TIMx_CCMRx寄存器的OCxPE位有关。如果OCxPE=0,即不使用CCR的预装载功能,则修改TIMx_CCR寄存器的值就是操作影子寄存器,新的CCR的值立即生效。否则,如果OCxPE==1,即使用CCR的预装载功能,则修改TIMx_ARR 寄存器的值就是操作预装载寄存器,要等到发生更新事件后,CCR预装载寄存器的值拷贝到影子寄存器中。

明白了OCxPE位的功用后,当OCxPE==1时,就不难理解为什么做OC比较输出时,发现修改CCR寄存器的值后可能需要最长1个ARR周期的延时后才能生效。

定时时间的计算:

如何实现500ms的定时?

(1)PSC = 72 - 1,定时器频率 = 72M / (PSC + 1) = 1MHz,周期1us,表示CNT计数一次为1us。在此计数周期下,最多能计数65536次,也就是65.5ms。

(2)ARR = 1000 - 1,从0计数到999,则计了1000次。

(3)中断周期T = 1000 * 1 / 1000000 = 1ms。

当我们修改PSC 和 ARR寄存器的值,就可以控制计数时间:

然后看一下PSC和ARR寄存器说明:

时基初始化结构体:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值