真的需要手动清除XMEGA定时器溢出中断标志吗?


8

你们中有些人可能知道,Atmel提供了一个软件框架(主要是Atmel Studio的一部分),该框架提供了驱动程序和示例,并且或多或少定期进行更新。

他们在最近的更新中明确指出,在中断回调函数中手动清除溢出中断标志很重要

 // * \subsection xmega_tc_qs_ovf_setup_code Example code
 // *
 // * Add a callback function that will be executed when the overflow interrupt
 // * trigger.
 // * \code
 static void my_callback(void)
 {
    // User code to execute when the overflow occurs here

    // THIS WAS ADDED IN LAST UPDATE
    // Important to clear Interrupt Flag
    tc_clear_overflow(&TCC0);
    // THIS WAS ADDED IN LAST UPDATE

 }
 //\endcode

根据XMEGAA数据表:

当执行相应的中断向量时,OVFIF将自动清除。该标志还可以通过在其位位置写入1来清除。

是否存在可能需要手动清除标志的场景/原因?


听起来答案是,如果您不打扰您,则需要手动将其清除。本质上是如果/何时轮询而不是使用中断。您只需在中断中读取寄存器并以某种方式显示它即可查看它是否真的被设置了。同样,尝试在未启用中断的情况下进行轮询,以查看是否已设置中断以及是否可以清除中断。验证文档是否正确。
old_timer '16

1
这不是我在Atmel产品中看到的第一种情况,该情况是在处理程序触发时似乎并未真正清除“自动清除”的中断。
康纳·沃尔夫

1
@ConnorWolf:真的吗?您还记得哪个控制器和中断吗?我们与Atmel控制器进行了大量安静的工作,这可能是一个潜在的陷阱。
Rev1.0

3
@ Rev1.0-我现在正在使用的示例:SAM4SD32C- 除非我明确阅读,否则在进入ISR时不会清除计时器中断(TC0_Handler等)。更深的挖掘,在这种情况下,这是因为中断从触发比较寄存器匹配位,并且不会被清除,直到明确阅读。IOW,我对实际原因不正确(不是直接ISR位),但是最终结果是相同的:如果不是ISR 标志,则必须手动清除ISR 原因TC0->TC_SRRCTC_SR
康纳·沃尔夫

1
也许有勘误表?
vicatcu'3

Answers:


1

是否存在可能需要手动清除标志的场景/原因?

不确定ASF,但是在某些情况下您需要取消任何未决的中断。例如,当(重新)配置计时器时,您可能要在重新启用中断之前禁用中断,修改计时器并取消可能在此期间发生的所有计时器中断。

如果您甚至没有溢出ISR,您仍然可以轮询OVIF来检测溢出,并重置标志以准备下一次溢出。


1

通常,我总是在启用给定中断之前清除中断标志,以防万一过去设置了中断标志。好像便宜的保险。

我不知道任何情况下都需要手动清除标志,除非您不使用中断,并且您正在使用定期执行的例程查看标志的设置来查看标志。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.