This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] UCD3138:16位定时器中断标志清零序列的说明、并建议使用 CMP0_INT_ENA 位来禁用中断

Guru**** 2331900 points
Other Parts Discussed in Thread: UCD3138
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/609466/ucd3138-clarification-of-16-bit-timer-interrupt-flag-clear-sequence-and-advice-using-the-cmp0_int_ena-bit-to-disable-the-interrupt

器件型号:UCD3138

第402页的 UCD3138技术参考手册建议使用以下语句来清除16位定时器中断标志 CMP0_INT_FLAG:

"TimerRegs.T16PWM1CMPCTRL.ALL |= 3;"

此语句起作用、但还有其他几个选项也起作用。  

一般性声明见第418页:

'通过向该位写入‘1’或重新写入 T16PWMxCMP0DAT 可将该位清零。'

通常、中断位在定时器中断结束时清零、这样定时器中断就不会立即重新进入。

但是、如果在后台模式中使用 CMP0_INT_ENA 位来禁用中断、则可能会错过中断。

使用 ARM7时、位设置和清零不是原子的、这意味着它可以在读取和写入之间被中断。  在 UCD 上、中断和后台处理同一寄存器中的不同位总是很危险的。  但是、在这种情况下、即使位设置是原子的、这仍然是一个问题。

以下是导致问题的顺序:

 后台代码清除 CMP0_INT_ENA 位。

2. 在受中断保护的后台代码期间、定时器超时、并且 CMP0_INT_FLAG 被置位。

3. 当设置 CMP0_INT_ENA 位的后台代码被执行时、它也会在 CMP0_INT_FLAG 位中读取和写入1。  这会清除 CMP0_INT_FLAG 位。

这会导致中断丢失。

如果 有必要保护后台代码不受该中断的影响、则应使用其他一些方法-禁用通用中断或清除中央中断模块中相关 PWM 的中断使能标志。