Как некоторые из вас могут знать, Atmel предоставляет программную среду (в основном как часть Atmel Studio), которая предоставляет драйверы и примеры и обновляется более или менее регулярно.
В недавнем обновлении они явно указывают, что важно вручную сбросить флаг прерывания переполнения в функции обратного вызова прерывания.
// * \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
Согласно спецификации XMEGAA:
OVFIF автоматически очищается при выполнении соответствующего вектора прерывания. Флаг также можно очистить, записав единицу в его местоположение бита.
Есть ли сценарий / причина, по которой ручная очистка флага может потребоваться?
SAM4SD32C
- Прерывания по таймеру ( TC0_Handler
и т. Д.) Не очищаются при входе в ISR, если я не читаю явно TC0->TC_SR
. Копание глубже, в этом случае, это потому, что прерывание запускается из RC
бита соответствия регистра сравнения, и это не очищается, пока вы явно не прочитаете TC_SR
. Итак, я не прав насчет фактической причины (это был не бит ISR напрямую), но конечный результат тот же: вы должны вручную очистить причину ISR , если не флаг ISR .