Правильный способ очистки флага прерывания на STM32 - PullRequest
0 голосов
/ 26 апреля 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 26 апреля 2018

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

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

...