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.

[参考译文] TM4C1294NCPDT:清除计时器 TATOINT 中断标志需要额外的时钟周期才能生效?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/573036/tm4c1294ncpdt-clearing-timer-tatoint-interrupt-flag-requires-extra-clock-cycles-to-take-effect

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:LM3S1968

我正在为一个类开发一些示例代码、遇到了我不希望看到的情况。  

我从 LM3S1968移植了一些 C 语言的定时器中断代码、该代码直接访问 GPTM 寄存器、而不是通过 PDL 访问。 Timer2A 超时中断处理程序中的最后一行执行此操作:

 TIMER2_ICR_R = TIMER_ICR_TATOCINT;

我发现的是中断触发一次、但在退出处理程序后立即再次触发。  在处理程序的第一条指令上设置断点会显示 TIMER_MIS 和 TIMER_RIS 在第一个中断上都有0x01、在第二个中断上都有0x0。  如果我在写入 ICR 寄存器后插入几条指令、则不会产生第二个中断。

我检查了数据表的 GPTM、NVIC 和异常模型部分、但在清除标志后没有看到任何关于需要额外时钟周期的警告。

我是否在别处遗漏了一些东西?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、
    我认为、所发生的情况是、完成写清零操作需要一些周期。 在退出 ISR 之前、该位的写入清零操作并未真正完成。 因此、当您退出 ISR 后、中断仍处于挂起状态、因为该标志尚未清除。 这就是为什么它将重新进入 ISR、但第二次清除标志。 到第二次进入 ISR 时、标志已被清除。 我可以建议两个选项。 首先、当您进入 ISR 时立即清除标志、这意味着将 TIMER2_ICR_R = TIMER_ICR_TATOCINT 移动为 ISR 的第一行、而不是最后一行。 第二个选项是在清除该位后读取 TIMER2_ICR_R 寄存器。 读取将保证在您退出 ISR 之前该标志被真正清除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles:

    是的、我认为这也是发生的情况。 我知道在 Stellaris MCU 上打开 RCGC 寄存器中的时钟时会出现类似的问题、但在 Tiva 上似乎不再出现这种情况。

    Ken