Правильный способ сбросить флаг прерывания на STM32

Я разрабатываю проект с нуля на STM32L4 и начинаю с существующей кодовой базы.

ISR реализованы следующим образом:

  1. прочитать статус прерывания в периферийном устройстве, чтобы узнать, какое событие (события) спровоцировало прерывание
  2. сделай что-нибудь
  3. снимите флажки, прочитанные в начале.

Это правильный способ убрать флаг? Разве флаги не следует сбрасывать в самом начале ISR? Насколько я понимаю, если одно и то же периферийное событие происходит во второй раз во время шага 2, оно не вызовет второй IRQ, поэтому оно будет потеряно. С другой стороны, если вы сбросите флаг, как только сможете, это второе событие вызовет импульс прерывания, состояние которого в ЦП изменится на «ожидающий и активный»: произойдет второе IRQ.

PS: Из Руководства по программированию процессоров STM32 я прочитал: «Прерывания STM32 чувствительны как к уровню, так и к импульсам».


person Guillaume Petitjean    schedule 26.04.2018    source источник


Ответы (1)


Определенно в начале (если у вас нет особых причин в логике программы), поскольку требуется некоторое время для фактической записи в регистр очистки флага для распространения по шинам.

Если вы по какой-то причине решили поместить его в конец прерывания, вам следует оставить некоторые инструкции, поместить команду барьера или прочитать регистр перед возвратом подпрограммы прерывания, чтобы убедиться, что операция очистки распространилась по шинам. В противном случае у вас могут возникнуть «фантомные» дублирующиеся рутинные вызовы.

person 0___________    schedule 26.04.2018