TC27x:读取 STM 计时器计数器值的正确方法是什么?

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

大家好,

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

有人能帮我解释一下吗?

非常感谢。

 

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 XiaTian,

不确定我是否正确理解了这个问题?

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.

 


BR,
thnO

在原帖中查看解决方案

0 点赞
5 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

你说的很合理。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 XiaTian,

不确定我是否正确理解了这个问题?

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.

 


BR,
thnO

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

@XiaTian
1)有人能帮我解释一下吗?
-实际上没有必要禁用中断。 由于 32 位外设总线一次只能读取 32 位信息,因此通过 STM 读取寄存器读取 64 位系统计时器的 32 位部分将自动通过硬件将 32 位以上的 STM 计时器捕获到 STM 捕获寄存器中。 因此,可以读取一致的 64 位 STM 计时器值,您可以参考用户手册中的 17.2 操作了解更多详细信息。
BR,
杰里米

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 thNo,非常感谢你的帮助。 这对我来说非常有用。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 Jeremy_zhou,

谢谢你的帮助,我现在有了阅读机制。

0 点赞