[i] Система прерываний в процессорах серии К1967ВНxx

ID статьи: 62891
Дата последнего изменения: 20.01.2026 17:00:14

В микроконтроллерах, на базе ядер Cortex за работу с прерываний отвечает NVIC - Nested vector interrupt control, он же контроллер приоритетных векторных прерываний.  NVIC является неотъемлемой частью процессоров M-профиля архитектуры ARM. В DSP процессорах его нет. В случае с серией К1967ВНxx, то в них за прерывания отвечает собственный контроллер, функционал которого похож на NVIC. В данном материалы попробуем поподробней разобраться в системе прерываний процессоров серии К1967ВНxx.

1. Источники событий и контроллер прерываний.

Документация на процессоры классифицирует прерывания следующим образом: аппаратные и программные. Далее по тексту программные прерывания называются программными исключения. Но к ним вернёмся чуть позднее. Общая схема процесса обработки прерывания представлена на рисунке 1 - она не сильно отличается от того, что мы привыкли видеть в ARM архитектуре при взаимодействии с NVIC.


 Рисунок 1 - Схема системы прерываний

Есть источники событий, как видно из рисунка они представлены в порядке убывания приоритета. Самое высокоприоритетное прерывание SW, и как отмечалось ранее оно же называется программным исключением. В название это заложено потому, что оно вызывается исполняемым кодом. То есть, вызывается при определенной ситуации выполнении команд. Например, доступ к длинным словам по не выровненному адресу. Также, данное прерывание может быть вызвано с помощью специальных команд TRAP, EMUTRAP. Стоит учитывать, что обработка данного прерывания отличия от обработки аппаратного. Далее по списку, начиная с HWERR, все этих события являются уже источниками аппаратных прерываний. Само прерывание HWERR говорит об аппаратной ошибке и может быть вызвано в случаях, когда, например, происходит доступ к отключенной SDRAM, ошибочная ситуация в DMA/AutoDMA, произошло широковещательное из внешней памяти и другие. Далее следуют высокоприоритетные прерывания от таймеров TIMER0/1H. Поскольку все приоритеты прерываний жестко заданы (в отличии от того же NVIC, где приоритет можно задать самому) для небольшой гибкости также добавили и прерывания от таймеров с низким приоритетом TIMER0/1L. nBUSLOCK - прерывание захвата шины происходит, когда процессор становится мастером шины. За ним, приоритетом ниже, следует векторное прерывание общего назначения VIRPT для использования другим мастером. nIRQ – прерывания от внешних источников (внешние прерывания). Далее следуют DMA13-0, то есть отдельное прерывание для каждого канала DMA, и прерывания для каждого из портов связи - LINK3-0. И остался последний источник прерываний KERNEL – являющий прерыванием от ядра.

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

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

Рассмотрим регистры блока прерываний и проведем аналогию всё с тем же NVIC из серии Cortex-M.

При работе с прерываниями основными в NVIC являются:

ISPR – регистр признака отложенного прерывания;

ISER – регистр разрешения прерываний;

IABR – регистр активных прерываний.

В процессорах ЦОС в аналогичных ролях выступают следующие регистры описания у них немного отличается, но суть функционала такая же:

ILAT – регистр «защёлки» прерываний;

IMASK – регистр маски или разрешения прерывания;

PMASK – регистр запросов прерываний, которые поступают на приоритетный шифратор.

Указанные выше регистры по документации являются 64 – разрядными, которые доступны как 2 32-разрядных регистра ILATL/ILATH, IMASKL/IMASKH, PMASKL/PMASKH. Регистр «защелки» имеет также два дублирующих регистра: для установки и сброса разрядов.

Помимо перечисленных в контроллере прерываний также присутствуют регистры для внутреннего таймера, а также регистр INRCTL который позволяет дать источникам прерываний небольшую «гибкость» при формировании запросов. К примеру, с его помощью можно настроить условие возникновение запроса внешнего прерывания.

И конечно, большим отличием от серии Cortex являются ранее упомянутые регистры группы прерываний А и B в которые заносятся адреса функции обработки прерываний. Куда для каждого прерывания задается адрес функции обработчика.


Рисунок 2 - Схема работы внешнего прерывания 

На рисунке 2, на примере прерывания от внешнего вывода nIRQ0, рассмотрена схема работы системы прерываний.

Как только приходит запрос на прерывание от устройства, он «защелкивается» и в регистре ILAT, соответствующему прерыванию выставляется бит запроса. Затем проверяется его маска, разрешен ли данный запрос в регистре IMASK. Здесь стоит отметить, что также должен быть выставлен бит глобального разрешения прерываний GIE, в регистре управления SQCTL. Если все эти условия выполнены и прерыванием является самым высокоприоритетным на данный момент, то ядро переходит по адресу обработчика прерываний и приступает к его обработке.

3. Пример

К данной статье приложен пример для отладочной платы микросхемы К1967ВН02BG, в котором демонстрируется работа внешнего прерывания по схеме, приведённой выше. В программе процессор постоянно моргает двумя верхними диодами на плате, а при нажатии и удерживании кнопки DSP1_IRQ0 на отладочной плате, происходит прерывание и моргает уже нижняя пара светодиодов.

Вся настройка данного прерывания очень простоя и приведена ниже:


__builtin_sysreg_write(__IVIRQ0, (int) INT); // Установить адрес функции прерывания
__builtin_sysreg_write(__SQCTLST, 4);        // Включить глобальные прерывания
__builtin_sysreg_write(__IMASKH, 1 << 9);      // Разрешить прерывание по внешнему выводу IRQ0

Единственное, надо не забыть указать компилятору с помощью специального атрибута, какая функция является обработчиком прерывания:

 
__attribute((interrupt))
void INT(void)
{
 .........
}

    

Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55