Seperti yang mungkin Anda ketahui, Atmel menyediakan kerangka kerja perangkat lunak (terutama sebagai bagian dari Atmel Studio) yang menyediakan driver dan contoh dan diperbarui secara berkala.
Dalam pembaruan baru-baru ini mereka menunjukkan secara eksplisit , bahwa penting untuk secara manual menghapus flag interupsi melimpah dalam fungsi interupsi panggilan balik.
// * \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
Menurut lembar data XMEGAA:
OVFIF secara otomatis dihapus ketika vektor interupsi yang sesuai dijalankan. Bendera juga dapat dihapus dengan menulis satu ke lokasi bitnya.
Apakah ada skenario / alasan di mana membersihkan bendera secara manual mungkin diperlukan?
c
atmel-studio
xmega
Rev1.0
sumber
sumber
SAM4SD32C
- Pengatur waktu menyela (TC0_Handler
, dll ...) tidak dihapus saat memasuki ISR kecuali saya secara eksplisit membacaTC0->TC_SR
. Menggali lebih dalam, dalam hal ini, itu karena interupsi dipicu dariRC
bit pertandingan register perbandingan, dan itu tidak dihapus sampai Anda secara eksplisit membacaTC_SR
. TKI, saya salah tentang penyebab sebenarnya (itu bukan bit ISR langsung), tetapi hasil akhirnya sama: Anda harus menghapus secara manual penyebab ISR , jika bukan bendera ISR .Jawaban:
Tidak yakin tentang ASF, tetapi ada kasus di mana Anda perlu membatalkan interupsi yang tertunda. Misalnya, ketika (kembali) mengonfigurasi timer Anda mungkin ingin menonaktifkan interupsi, memodifikasi timer, dan membatalkan semua interupsi timer yang mungkin telah terjadi dalam waktu yang berarti, sebelum mengaktifkan kembali interupsi.
Jika Anda bahkan tidak memiliki ISR overflow, Anda masih bisa polling OVIF untuk mendeteksi overflow, dan mengatur ulang bendera untuk mempersenjatai itu untuk overflow berikutnya.
sumber
Secara umum, saya selalu menghapus flag interupsi sesaat sebelum mengaktifkan interupsi yang diberikan, seandainya ada sesuatu yang mengatur flag di masa lalu. Sepertinya asuransi murah.
Saya tidak mengetahui adanya skenario di mana Anda perlu menghapus flag secara manual kecuali jika Anda tidak menggunakan interupsi, dan Anda melihat flag dengan rutin yang dijalankan secara berkala untuk memeriksa flag yang ditetapkan.
sumber