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?
c
atmel-studio
xmega
Rev1.0
fonte
fonte
SAM4SD32C
- As interrupções do timer (TC0_Handler
, etc ...) não são limpas ao entrar no ISR, a menos que eu leia explicitamenteTC0->TC_SR
. Indo mais fundo, nesse caso, é porque a interrupção é acionada a partir doRC
bit de correspondência do registro de comparação e isso não é limpo até que você leia explicitamenteTC_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 .Respostas:
Não tenho certeza sobre o ASF, mas há casos em que você precisa cancelar qualquer interrupção pendente. Por exemplo, ao (re) configurar um cronômetro, você pode desativar as interrupções, modificá-lo e cancelar as interrupções que possam ter ocorrido nesse período, antes de reativar as interrupções.
Se você ainda não possui um ISR de estouro, ainda pode pesquisar o OVIF para detectar o estouro e redefinir o sinalizador para armar para o próximo estouro.
fonte
Em geral, eu sempre limpo os sinalizadores de interrupção antes de ativar uma determinada interrupção, caso algo tenha definido o sinalizador no passado. Parece seguro barato.
Não conheço nenhum cenário em que você precise limpar manualmente o sinalizador, a menos que não esteja usando interrupções, e você está olhando para o sinalizador com uma rotina que é executada periodicamente para verificar se o sinalizador está sendo definido.
fonte