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