Comme certains d'entre vous le savent peut-être, Atmel fournit un cadre logiciel (principalement dans le cadre d'Atmel Studio) qui fournit des pilotes et des exemples et est mis à jour plus ou moins régulièrement.
Dans une mise à jour récente, ils soulignent explicitement qu'il est important d'effacer manuellement l'indicateur d'interruption de débordement dans la fonction de rappel d'interruption.
// * \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
Selon la fiche technique XMEGAA:
OVFIF est automatiquement effacé lorsque le vecteur d'interruption correspondant est exécuté. Le drapeau peut également être effacé en écrivant un un à son emplacement de bit.
Y a-t-il un scénario / une raison pour lequel la suppression manuelle du drapeau peut être nécessaire?
c
atmel-studio
xmega
Rev1.0
la source
la source
SAM4SD32C
- Les interruptions du temporisateur (TC0_Handler
, etc ...) ne sont pas effacées lors de l'entrée dans l'ISR à moins que je ne les lise explicitementTC0->TC_SR
. En creusant plus profondément, dans ce cas, c'est parce que l'interruption est déclenchée à partir duRC
bit de correspondance du registre de comparaison, et cela n'est pas effacé jusqu'à ce que vous lisez explicitementTC_SR
. IOW, je me trompe sur la cause réelle (ce n'était pas le bit ISR directement), mais le résultat final est le même: vous devez effacer manuellement la cause ISR , sinon l' indicateur ISR .Réponses:
Pas sûr de l'ASF, mais il y a des cas où vous devez annuler toute interruption en attente. Par exemple, lorsque vous (re) configurez un temporisateur, vous pouvez désactiver les interruptions, modifier le temporisateur et annuler toutes les interruptions du temporisateur qui se sont produites entre-temps, avant de réactiver les interruptions.
Si vous ne disposez même pas d'un ISR de débordement, vous pouvez toujours interroger l'OVIF pour détecter le débordement et réinitialiser l'indicateur pour l'armer pour le prochain débordement.
la source
En général, j'efface toujours les drapeaux d'interruption juste avant d'activer une interruption donnée, au cas où quelque chose aurait mis le drapeau dans le passé. On dirait une assurance bon marché.
Je ne connais aucun scénario dans lequel vous devez effacer manuellement l'indicateur, sauf si vous n'utilisez pas d'interruptions, et vous examinez l'indicateur avec une routine qui s'exécute périodiquement pour vérifier que l'indicateur est défini.
la source