第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 的中断使能标志。