Как некоторые из вас могут знать, 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 автоматически очищается при выполнении соответствующего вектора прерывания. Флаг также можно очистить, записав единицу в его местоположение бита.
Есть ли сценарий / причина, по которой ручная очистка флага может потребоваться?
c
atmel-studio
xmega
rev1.0
источник
источник
SAM4SD32C
- Прерывания по таймеру (TC0_Handler
и т. Д.) Не очищаются при входе в ISR, если я не читаю явноTC0->TC_SR
. Копание глубже, в этом случае, это потому, что прерывание запускается изRC
бита соответствия регистра сравнения, и это не очищается, пока вы явно не прочитаетеTC_SR
. Итак, я не прав насчет фактической причины (это был не бит ISR напрямую), но конечный результат тот же: вы должны вручную очистить причину ISR , если не флаг ISR .Ответы:
Не уверен насчет ASF, но есть случаи, когда вам нужно отменить любое ожидающее прерывание. Например, при (пере) настройке таймера вы можете захотеть отключить прерывания, изменить таймер и отменить любые прерывания таймера, которые могли произойти за это время, перед повторным включением прерываний.
Если у вас даже нет ISR переполнения, вы все равно можете опросить OVIF, чтобы обнаружить переполнение, и сбросить флаг, чтобы активировать его для следующего переполнения.
источник
В общем, я всегда очищаю флаги прерываний непосредственно перед включением данного прерывания, на случай, если что-то установит флаг в прошлом. Похоже на дешевую страховку.
Я не знаю ни одного сценария, в котором вам нужно вручную очищать флаг, если вы не используете прерывания, и вы смотрите на флаг с помощью подпрограммы, которая периодически выполняется, чтобы проверить, установлен ли флаг.
источник