你们中有些人可能知道,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
这不是我在Atmel产品中看到的第一种情况,该情况是在处理程序触发时似乎并未真正清除“自动清除”的中断。
—
康纳·沃尔夫
@ConnorWolf:真的吗?您还记得哪个控制器和中断吗?我们与Atmel控制器进行了大量安静的工作,这可能是一个潜在的陷阱。
—
Rev1.0
@ Rev1.0-我现在正在使用的示例:
—
康纳·沃尔夫
SAM4SD32C
- 除非我明确阅读,否则在进入ISR时不会清除计时器中断(TC0_Handler
等)。更深的挖掘,在这种情况下,这是因为中断从触发比较寄存器匹配位,并且是不会被清除,直到明确阅读。IOW,我对实际原因不正确(不是直接ISR位),但是最终结果是相同的:如果不是ISR 标志,则必须手动清除ISR 原因。TC0->TC_SR
RC
TC_SR
也许有勘误表?
—
vicatcu'3