ご存知かもしれませんが、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
これは、ハンドラーの起動時に「自動的にクリアされた」割り込みが実際にはクリアされないように見えるAtmel製品で見た最初のケースではありません。
—
Connor Wolf
@ConnorWolf:本当に?どのコントローラーと割り込みを覚えていますか?私たちはAtmelコントローラーで静かに作業しますが、これは潜在的な落とし穴になる可能性があります。
—
Rev1.0 '25年
@ Rev1.0-私が今作業している例:
—
コナーウルフ
SAM4SD32C
- 明示的に読んでいない限り、ISRに入るときにタイマー割り込み(TC0_Handler
など)はクリアされませんTC0->TC_SR
。深く掘り、この場合には、割り込みからトリガされるためですRC
比較レジスタ一致ビット、およびそれはあなたが明示的に読まれるまでクリアされませんTC_SR
。IOW、私は実際の原因については正しくありませんが(ISRビットは直接ではありませんでした)、最終結果は同じです。ISR フラグでない場合は、ISR 原因を手動でクリアする必要があります。
たぶんエラッタはありますか?
—
vicatcu 2017年