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?
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 explicitement TC0->TC_SR
. En creusant plus profondément, dans ce cas, c'est parce que l'interruption est déclenchée à partir du RC
bit de correspondance du registre de comparaison, et cela n'est pas effacé jusqu'à ce que vous lisez explicitement TC_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 .