关于这个问题,很多前辈都有所描述。“因为从0开始计数,所以xxxx”
直到我看了手册才完全理解。我开始的理解是,预分频器,从36M的时钟或者42M的时钟总线上获得时间长度为T每次的脉冲后,会按照这个时间进行计数。众所周知,定时器就是计数器+时钟。
那么问题就出在这个计数器上。计数开始时刻是从第0次脉冲开始的。结束到设定ARR 也就是0x36(时钟脉冲结束的时候)。我之前理解的从0脉冲开始的时候开始一个周期,计数到ARR值“开始时刻”,开始一个新周期。那么实际计数值就比输入值多1就合理了。arr的计算也是同理。
但问题来了。嘻嘻既然拿出来写一篇文档肯定还是要有点东西的。
那就是,我们在控制电机S曲线或者一些算法的时候需要不断刷新arr值。手册中有写arr pcs都是1~65535有效。emmm,0为啥无效。这不是相当于我们计算所得的arr==1的话,写入寄存器的时候再-1.就是0了吗?事实证明。arr=0不会触发中断(或许我没有耐心等到32位的TIM2 Count到溢出),定时器一直在计数。
所以,相当于变相的,不能做单次分频时钟的计数了?因为我用的是TIM2对TIM3计数中断次数。话分两头各表一枝,嘻嘻。这里要考虑的是因为虽然可以在TIM3定义一个中断然后给个变量计数。emmm那不是因为51资源太少没办法嘛。能用硬件,就让CPU少进中断吧。所以,TIM2的“单次分频时钟的计数”问题势必要解决。
方法来了。在启动定时器时候给TIM2->CNT 赋值 1。在TIM2中断中 不断TIM2->CNT=1。亲测有效。
欢迎评论交流。希望能帮助到同类小白。
STM32定时器预分频PCS和定时ARR必须“=理论值-1”的问题以及不用“-1”的办法
最新推荐文章于 2025-02-06 19:37:09 发布