Como alguns de vocês devem saber, o Atmel fornece uma estrutura de software (principalmente como parte do Atmel Studio) que fornece drivers e exemplos e é atualizada com mais ou menos regularidade.
Em uma atualização recente, eles explicitamente apontam que é importante limpar manualmente o sinalizador de interrupção de estouro na função de retorno de chamada de interrupção.
// * \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
De acordo com a folha de dados do XMEGAA:
OVFIF é limpo automaticamente quando o vetor de interrupção correspondente é executado. A bandeira também pode ser limpa escrevendo uma na sua localização de bits.
Existe um cenário / motivo pelo qual a limpeza manual do sinalizador pode ser necessária?
SAM4SD32C
- As interrupções do timer ( TC0_Handler
, etc ...) não são limpas ao entrar no ISR, a menos que eu leia explicitamente TC0->TC_SR
. Indo mais fundo, nesse caso, é porque a interrupção é acionada a partir do RC
bit de correspondência do registro de comparação e isso não é limpo até que você leia explicitamente TC_SR
. IOW, estou incorreto sobre a causa real (não era o bit ISR diretamente), mas o resultado final é o mesmo: você deve limpar manualmente a causa ISR , se não o sinalizador ISR .