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

1
これは、ハンドラーの起動時に「自動的にクリアされた」割り込みが実際にはクリアされないように見えるAtmel製品で見た最初のケ​​ースではありません。
Connor Wolf

1
@ConnorWolf:本当に?どのコントローラーと割り込みを覚えていますか?私たちはAtmelコントローラーで静かに作業しますが、これは潜在的な落とし穴になる可能性があります。
Rev1.0 '25年

3
@ Rev1.0-私が今作業している例:SAM4SD32C- 明示的に読んでいない限り、ISRに入るときにタイマー割り込み(TC0_Handlerなど)はクリアされませんTC0->TC_SR。深く掘り、この場合には、割り込みからトリガされるためですRC比較レジスタ一致ビット、およびそれはあなたが明示的に読まれるまでクリアされませんTC_SR。IOW、私は実際の原因については正しくありませんが(ISRビットは直接ではありませんでした)、最終結果は同じです。ISR フラグでない場合は、ISR 原因を手動でクリアする必要があります。
コナーウルフ

1
たぶんエラッタはありますか?
vicatcu 2017年

回答:


1

フラグを手動でクリアする必要があるシナリオ/理由はありますか?

ASFについては不明ですが、保留中の割り込みをキャンセルする必要がある場合があります。たとえば、タイマーを(再)構成する場合、割り込みを再度有効にする前に、割り込みを無効にし、タイマーを変更し、その間に発生した可能性のあるタイマー割り込みをキャンセルすることができます。

オーバーフローISRがない場合でも、OVIFをポーリングしてオーバーフローを検出し、フラグをリセットして次のオーバーフローに備えることができます。


1

一般に、過去に何かがフラグを設定した場合に備えて、特定の割り込みを有効にする直前に常に割り込みフラグをクリアします。安い保険のようです。

割り込みを使用していない場合を除き、手動でフラグをクリアする必要があるシナリオを知りません。フラグが設定されているかどうかを確認するために定期的に実行されるルーチンでフラグを調べています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.