ФЭНДОМ


Общие сведения

Контроллер прерываний NVIC является неотъемлемой частью процессоров M-профиля архитектуры ARM. В зависимости от особенностей конкретной реализации он может поддерживать до 496 линий запросов прерываний в версии архитектуры ARMv7-M и до 32 линий в версии AMv6-M. Для версии ARMv7-M количество линий запросов прерываний можно определить, прочитав содержимое формально не относящегося к NVIC регистра ICTR; для версии ARMv6-M возможности программно определить количество линий нет.

Функционирование контроллера прерываний

Фиксация запросов прерываний

Запросы прерываний поступают в NVIC по нескольким линиям, число которых определяется реализацией. Согласно документации фирмы ARM, каждая из этих линий может обнаруживать запросы по уровню сигнала (level-sensitive) или по импульсу (pulse-sensitive), что, однако, контролируется не программистом, а определяется во время создания микросхемы микроконтроллера в зависимости от потребностей устройств, подключаемых к тем или иным линиям запроса прерываний.

Методы обнаружения запросов, используемые в NVIC, отличаются от таковых в подавляющем большинстве других контроллеров прерываний, используемых как с процессорами архитектуры ARM, так и в других архитектурах. Обнаружение по импульсу в определённой степени можно считать аналогом широко распространённого обнаружения запроса по перепаду (edge-sensitive); обнаружение по уровню, хотя и совпадает по названию с самым популярным методом, используемым практически во всех контроллерах прерываний, работает несколько иным способом. Ниже описывается логика функционирования NVIC в части, касающейся фиксации поступления запросов прерываний, как она видится в соответствии с приводимым в документации псевдокодом.

1. Запрос на перевод некоторого прерывания в состояние «ожидает обработки» (pending) возникает при выполнении любого из следующих трёх условий:

  • при записи 1 в соответствующий бит одного из регистров ISPR (программная установка запроса внешнего прерывания). Хотя в приводимом в документации псевдокоде это не указано прямо, резонно предположить, что сюда относится и программная выдача запроса прерывания с помощью записи в регистр STIR (об чём имеется упоминание в описании);
  • при обнаружении импульса на линии запроса прерывания (импульсом считается наличие активного уровня на линии запроса прерывания в момент очередного фронта глобального синхросигнала при наличии неактивного уровня в момент предыдущего фронта синхроимпульса);
  • при наличии на линии запроса прерывания активного уровня в тот момент, когда производится сброс признака активности прерывания (последнее происходит при выходе из обработчика данного прерывания либо при записи 1 в бит VECTCLRACTIVE регистра AIRCR).

2. Запрос на сброс состояния «ожидает обработки» возникает при выполнении любого из следующих двух условий:

  • при вызове обработчика данного прерывания (переход прерывания из состояния «ожидает обработки» в состояние «активно»);
  • при записи 1 в соответствующий разряд регистра ICPR при условии, что на линии запроса прерывания находится неактивный уровень.

Таким образом, запрос прерывания уровнем, используемый в NVIC, отличается от настоящего запроса уровнем тем, что состояние «ожидает обработки» сбрасывается при вызове обработчика данного прерывания, в то время как при настоящем запросе уровнем оно бы сохранялось до тех пор, пока линия запроса прерывания не перешла бы в неактивное состояние (что происходит при снятии запроса прерывания самим устройством, выдавшим запрос). Запрос прерывания импульсом отличается от запроса прерывания фронтом тем, что состояние «ожидает обработки» фиксируется в том случае, если переход линии запроса прерывания из неактивного в активное состояние имел место между двумя импульсами синхронизации, причём в активном состоянии она находилась достаточно долго, чтобы этот переход был зафиксирован по очередному фронту синхросигнала (запрос фронтом является асинхронным: прерывание становится ожидающим обработки сразу при переходе линии запроса из неактивного состояния в активное независимо от каких-либо синхросигналов).

Управление прерываниями

Каждая линия запроса прерывания может быть индивидуально разрешена или запрещена. Если некоторое прерывание запрещено, появление соответствующего запроса будет зафиксировано (прерывание перейдёт в состояние «ожидает обработки»), однако не приведёт к собственно прерыванию (переход его в состояние «активно» невозможен). В конкретной аппаратной реализации некоторые запросы прерываний могут быть принудительно разрешены (попытка их запретить игнорируется), а другие — принудительно запрещены (это имеет место в отношении линий, которые логически имеются, но физически не реализованы или не используются).

Каждому запросу прерывания программа может назначить собственный приоритет.

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

Для процессора архитектуры ARMv7-M программа может прочитать биты активности каждого из возможных запросов прерываний и тем самым определить, какие прерывания обрабатываются в данный момент. В процессорах архитектуры ARMv6-M такой возможности нет.

Регистры контроллера прерываний

Список регистров, входящих в состав NVIC, приведён в следующей таблице. В управлении прерываниями, помимо этих регистров, участвует ряд регистров состояния процессора и регистров пространства управления системой.

Адрес Обозначение Доступ Значение после сброса Описание
E000E100-E000E13C NVIC_ISER0 – NVIC_ISER15
RW
00000000
Регистры разрешения прерываний
E000E180-E000E1BC NVIC_ICER0 – NVIC_ICER15
RW
00000000
Регистры запрещения прерываний
E000E200-E000E23C NVIC_ISPR0 – NVIC_ISPR15
RW
00000000
Регистры установки состояния «ожидает обработки»
E000E280-E000E2BC NVIC_ICPR0 – NVIC_ICPR15
RW
00000000
Регистры сброса состояния «ожидает обработки»
E000E300-E000E33C NVIC_IABR0 – NVIC_IABR15
RO
00000000
Регистры активности прерываний
E000E400-E000E5EC NVIC_IPR0 – NVIC_IPR123
RW
00000000
Регистры приоритетов прерываний

Все регистры, кроме NVIC_IPR, доступны лишь как полные слова. В версии ARMv7-M регистры NVIC_IPR могут адресоваться полными словами, полусловами или отдельными байтами; в версии ARMv6-M они тоже должны адресоваться лишь полными словами. Попытка выполнить иной доступ приведёт к непредсказуемым последствиям.

Количество реально имеющихся регистров зависит от числа реализованных линий запросов прерываний. Один регистр, за исключением NVIC_IPR, соответствует 32 линиям запросов прерываний, один регистр NVIC_IPR — четырём линиям. Если число линий не соответствует общему числу битов в регистрах, старшие биты регистров с наибольшим номером не используются (считываются как нули, запись в них игнорируется).

Примечание. В документации фирмы ARM относительно диапазона адресов, занимаемых регистрами приоритетов прерываний, допущена ошибка: указан диапазон от E000E400 до E000E7EC.

Регистры разрешения прерываний NVIC_ISER

Адрес: E000E100-E000E13C
Доступ: чтение-запись
Наличие: число регистров зависит от числа реализованных линий запросов прерываний

ARM M-profile NVIC ISER

Формат регистра разрешения прерываний NVIC_ISER

Разряды Доступ Обозначение Функция
31:0
RW
SETENA Каждый разряд соответствует одной линии запроса прерываний: бит 0 — линии с номером 32*N, бит 1 — линии с номером 32*N+1 и т.д., где N — номер данного регистра.

При записи:

  • 0 — игнорируется
  • 1 — прерывание разрешается

При считывании:

  • 0 — прерывание запрещено
  • 1 — прерывание разрешено

Регистры запрещения прерываний NVIC_ICER

Адрес: E000E180-E000E1BC
Доступ: чтение-запись
Наличие: число регистров зависит от числа реализованных линий запросов прерываний

ARM M-profile NVIC ICER

Формат регистра запрещения прерываний NVIC_ICER

Разряды Доступ Обозначение Функция
31:0
RW
CLRENA Каждый разряд соответствует одной линии запроса прерываний: бит 0 — линии с номером 32*N, бит 1 — линии с номером 32*N+1 и т.д., где N — номер данного регистра.

При записи:

  • 0 — игнорируется
  • 1 — прерывание запрещается

При считывании:

  • 0 — прерывание запрещено
  • 1 — прерывание разрешено

Регистры установки состояния «ожидает обработки» NVIC_ISPR

Адрес: E000E200-E000E23C
Доступ: чтение-запись
Наличие: число регистров зависит от числа реализованных линий запросов прерываний

ARM M-profile NVIC ISPR

Формат регистра установки состояния ожидания обработки прерываний NVIC_ISPR

Разряды Доступ Обозначение Функция
31:0
RW
SETPEND Каждый разряд соответствует одной линии запроса прерываний: бит 0 — линии с номером 32*N, бит 1 — линии с номером 32*N+1 и т.д., где N — номер данного регистра.

При записи:

  • 0 — игнорируется
  • 1 — состояние ожидания обработки устанавливается

При считывании:

  • 0 — прерывание не находится в состоянии ожидания обработки
  • 1 — прерывание находится в состоянии ожидания обработки

Регистры сброса состояния «ожидает обработки» NVIC_ICPR

Адрес: E000E280-E000E2BC
Доступ: чтение-запись
Наличие: число регистров зависит от числа реализованных линий запросов прерываний

ARM M-profile NVIC ICPR

Формат регистра сброса состояния ожидания обработки прерываний NVIC_ICPR

Разряды Доступ Обозначение Функция
31:0
RW
CLRPEND Каждый разряд соответствует одной линии запроса прерываний: бит 0 — линии с номером 32*N, бит 1 — линии с номером 32*N+1 и т.д., где N — номер данного регистра.

При записи:

  • 0 — игнорируется
  • 1 — состояние ожидания обработки сбрасывается

При считывании:

  • 0 — прерывание не находится в состоянии ожидания обработки
  • 1 — прерывание находится в состоянии ожидания обработки

Регистры активности прерываний NVIC_IABR

Адрес: E000E300-E000E33C
Доступ: только чтение
Наличие: только ARMv7-M; число регистров зависит от числа реализованных линий запросов прерываний

ARM M-profile NVIC IABR

Формат регистра активности прерываний NVIC_IABR

Разряды Доступ Обозначение Функция
31:0
RW
ACTIVE Каждый разряд соответствует одной линии запроса прерываний: бит 0 — линии с номером 32*N, бит 1 — линии с номером 32*N+1 и т.д., где N — номер данного регистра:
  • 0 — прерывание не активно
  • 1 — прерывание активно

Регистры режимов безопасности NVIC_ITNS

Регистры приоритетов прерываний NVIC_IPR

Адрес: E000E400-E000E5EC
Доступ: чтение-запись
Наличие: число регистров зависит от числа реализованных линий запросов прерываний

ARM M-profile NVIC IPR

Формат регистра приоритетов прерываний NVIC_IPR

Разряды Доступ Обозначение Функция
31:24
RW
PRI_N3 Приоритет прерывания с номером 4*N+3, где N — номер данного регистра
23:16
RW
PRI_N2 Приоритет прерывания с номером 4*N+2, где N — номер данного регистра
15:8
RW
PRI_N3 Приоритет прерывания с номером 4*N+1, где N — номер данного регистра
7:0
RW
PRI_N3 Приоритет прерывания с номером 4*N, где N — номер данного регистра

Количество реально имеющихся битов приоритета зависит от реализации (для версии ARMv6-M их всегда только два). Реализованные биты всегда являются старшими разрядами поля приоритета, при этом младшие биты считываются как нули, а запись в них игнорируется.

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.