在使用hal库配置定时器步骤一般分为
1.配置分频数PSC,决定时基快慢。
2.配置装载值ARR,决定要计数多少个时基才到定时时间。
然后启动定时器开始工作,这样定时器每次从0开始计到ARR就认为定时器到时,触发中断通知CPU调用中断服务函数做处理。定时器中有个CNT寄存器存的就是当前的计时值,即当CNT>ARR,则计时时间到,CNT自动清0。
在一些特殊的应用下,我们要求定时时间是要变的,因此我们需要随时修改ARR的值来达到修改定时时间的目的。举例:我们的ARR为1000,当前CNT为600,若我们需要缩短到1/10的计时时间,则需要修改ARR为100,若此时CNT为600,马上会触发CNT>ARR中断,而此时并不是我们想要的时间点,我们是希望修改完ARR后的100个计时基准才算定时时间到。因此我们在每次修改ARR时候,必须先将CNT清0,然后修改ARR,这样才可以避免修改ARR导致时间不准的情况。
STM32的TIM->ARR寄存器实际上对应了两个寄存器:一个是用户可以写入或读出数据的寄存器,称为preload register(预装载寄存器),也就是TIM->ARR。另一个是用户看不见的、但在操作中真正起作用的寄存器称为shadow register(影子寄存器)。当我们需要修改定时时间的时候,其实修改的是表面那个预装载寄存器,要让这个修改起作用,就还要把预装载寄存器的值赋给影子寄存器才行。因为每次TIM->CNT计数都是跟影子寄存器比较,若满足条件才触发中断。那么根据不同的需求 :
从ARR预装载寄存器传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“APRE”位:
APRE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
APRE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值;
还有个小细节要特别注意:就是注意定时器里面所有寄存器的位数都是16位的,所以取值范围为0-65535,若超过该值,则只会取到低16位。举例说明:时钟频率为72M, 分频数3600-1,这样计时频率就为20000Hz,若我们需要定时1s,则设置TIM->ARR为20000,3s则是60000,若我们定时器10s,则需要设置为100000,这个值已经大于65535了,因此只会取其低16位为34465,此时实际计时才34465/20000=1.7s
|