Действительно ли необходимо вручную очищать флаг прерывания переполнения таймера XMEGA?

8

Как некоторые из вас могут знать, 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 автоматически очищается при выполнении соответствующего вектора прерывания. Флаг также можно очистить, записав единицу в его местоположение бита.

Есть ли сценарий / причина, по которой ручная очистка флага может потребоваться?

rev1.0
источник
Похоже, ответ: если вы не прерываете, вам нужно вручную очистить его. по существу, если / при опросе вместо использования прерываний. Вы можете просто прочитать регистр в прерывании и каким-то образом отобразить его, чтобы увидеть, действительно ли он установлен. аналогично попробуйте опрос без включенного прерывания и посмотрите, установлено ли оно и можно ли его очистить. проверить документацию правильно или не правильно.
old_timer
1
Это был бы не первый случай, который я видел в продуктах Atmel, когда «автоматически очищаемое» прерывание, по-видимому, не очищается при срабатывании обработчика.
Коннор Вольф
1
@ConnorWolf: правда? Вы помните, какой контроллер и прерывание? Мы много работаем с контроллерами Atmel, и это может стать потенциальной ошибкой.
Rev 1.0
3
@ Rev1.0 - Пример, с которым я сейчас работаю: SAM4SD32C- Прерывания по таймеру ( TC0_Handlerи т. Д.) Не очищаются при входе в ISR, если я не читаю явно TC0->TC_SR. Копание глубже, в этом случае, это потому, что прерывание запускается из RCбита соответствия регистра сравнения, и это не очищается, пока вы явно не прочитаете TC_SR. Итак, я не прав насчет фактической причины (это был не бит ISR напрямую), но конечный результат тот же: вы должны вручную очистить причину ISR , если не флаг ISR .
Коннор Вольф
1
Может быть, есть ошибки?
Викачу

Ответы:

1

Есть ли сценарий / причина, по которой ручная очистка флага может потребоваться?

Не уверен насчет ASF, но есть случаи, когда вам нужно отменить любое ожидающее прерывание. Например, при (пере) настройке таймера вы можете захотеть отключить прерывания, изменить таймер и отменить любые прерывания таймера, которые могли произойти за это время, перед повторным включением прерываний.

Если у вас даже нет ISR переполнения, вы все равно можете опросить OVIF, чтобы обнаружить переполнение, и сбросить флаг, чтобы активировать его для следующего переполнения.

JimmyB
источник
1

В общем, я всегда очищаю флаги прерываний непосредственно перед включением данного прерывания, на случай, если что-то установит флаг в прошлом. Похоже на дешевую страховку.

Я не знаю ни одного сценария, в котором вам нужно вручную очищать флаг, если вы не используете прерывания, и вы смотрите на флаг с помощью подпрограммы, которая периодически выполняется, чтобы проверить, установлен ли флаг.

user103218
источник