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