Cortex: NVIC, пожалуйста, продемонстрируйте, как сделать так, чтобы он определялся уровнем или краем при помощи программного обеспечения - PullRequest
4 голосов
/ 22 июля 2011

Я прочитал документ ARM о Cortex-M3 (или M0), и в нем говорится, что он может использоваться в качестве чувствительного уровня или импульсного (краевого) прерывания в контроллере NVIC.Проблема в том, что это довольно расплывчато в том, как это сделать, если это делается с помощью программного обеспечения.

Я не вижу ни одного регистра в NVIC или такого, который управляет типом прерывания (выбрать край илиуровень путем регулировки битов регистра).Таким образом, что-то должно быть сделано программным обеспечением в обработчике, но опять-таки в этой области оно расплывчато.

Мне нравится слышать, что у кого-то есть способ сделать это прерыванием по фронту или уровню с помощью программного обеспечения.

Пожалуйста, продемонстрируйтев коде обработчика (если он это контролирует), который он обнаруживает для уровня или импульса.

Если это обнаружение уровня, я могу держать прерывание активным и отключать его обработчиком, пока не восстановим внешним кодом, для которогоэто повторно оправдать прерывание.Это то, что я пытаюсь сделать, но это не будет работать, если это тип обнаружения импульса.

Thx

1 Ответ

6 голосов
/ 22 июля 2011

Документ, описывающий, как NIVC Cortex-M3 обрабатывает прерывания, инициируемые на уровне или по фронту (импульс), можно найти здесь:

Это вполне может быть документ, на который вы ссылаетесь в своем вопросе.Книга Джозефа Юи «Полное руководство по ARM Cortex-M3» также содержит довольно хорошее описание.

Конкретной конфигурации NVIC для этих двух типов сигналов прерывания нет - она ​​обрабатывает оба типа.По существу, когда устанавливается прерывание (на уровне или по краю), NVIC фиксирует этот статус в регистре SETPENDx.Когда к ISR для этого прерывания применяется вектор, соответствующий бит в регистре ACTIVEx будет установлен, а бит в регистре SETPENDx будет очищен.

Пока прерывание активно, если прерываниелиния переходит из неактивного в активное состояние, ожидающий бит будет снова включен, и по возвращении из текущего активного экземпляра ISR прерывание будет обработано снова.Это обрабатывает случай прерывания, инициируемого фронтом.

Кроме того, когда ISR возвращается (и NVIC очищает «активный» бит), NIVC пересмотрит состояние линии прерывания - если он все еще утвержден, он установитснова ожидающий бит (даже если не было перехода от неактивного к активному).Это обрабатывает случай, когда прерывание инициируется на уровне, и ISR не удалось вызвать прерывание (возможно, второе устройство на общей линии IRQ установило свое прерывание только в критический момент, чтобы не было временикогда линия прерывания была неактивной).

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

Я не уверен, что я действительно понимаю, что вы ищете здесь, но я думаю, что вы могли бы делать то, что вы хотите, используя регистры NVIC SETENAx и CLRENAx для включения / выключенияпрерывание.Они работают независимо от ожидающих битов, поэтому прерывание может быть ожидающим (или становящимся ожидающим), даже если прерывание отключено.Таким образом, вы можете отложить обработку прерывания так долго, как захотите.

Если этого недостаточно, учтите также, что вы можете вызвать прерывание с помощью программного обеспечения, просто установив бит ожидания в соответствующий SETPENDx регистр - ЦП будет передавать сигнал на ISR так же, как если бы было установлено аппаратное прерывание (при условии, что прерывание включено в регистре SETENAx).Вы также можете использовать «Регистр прерываний программного запуска» (STIR) для запуска прерывания программным обеспечением.

...