单片机/MCU论坛
直播中

李斌

7年用户 1404经验值
私信 关注

读出STM0.TIM0的当前计数器值,在读取计数器之前我需要禁用所有中断吗?

我正在尝试读出STM0.tiM0的当前计数器值,我的问题是,在读取计数器之前我需要禁用所有中断吗。 在我看来,读取计数器的处理可能会受到其他中断的影响,这可能会导致我从寄存器读取错误的值。 例如,当我只读出较低的 16 位计数器值时,就会触发一个中断,因此只有在处理中断函数后才能读出较高的 16 位值。 然后我得到一个错误的值。
有人能帮我解释一下吗?

回帖(2)

乔银栓

2024-1-25 10:04:26
STM0.TIM0 是一个 32 位寄存器。 完整的 32 位值可以用一条指令读取。 当使用一条指令执行访问时,无需禁用 IRQ。

如果对 TimX 寄存器进行了多次访问(例如 TIM0 和 TIM6 以获得完整的 64 位值),禁用 IRQ 不会阻止计时器增加。 因此,在多次读取访问时,SW 需要处理向较高寄存器部分的潜在增量/增量。
可以这样做(伪代码)

uint32 high1, high2, low;do {    high1 = TIM6;    low = TIM0;    high2 = TIM6;} while (high1 != high2);// "high1" together with "low" contain the 64-bit counter value.
举报

study875

2024-1-26 09:53:45
在读取STM0.TIM0的当前计数器值之前,你不需要禁用所有中断。读取计数器的处理只会受到中断的影响,如果一个中断在读取计数器的过程中触发,你可能会得到错误的值。

为了确保获取准确的计数器值,你可以在读取计数器之前禁用相关的中断,并在读取完成后重新启用它们。这样可以避免其他中断的干扰。具体的实现方法因应你所使用的编程语言和硬件平台而有所不同,你可以在官方文档或相关论坛上查询具体的方法。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分