Определённым событиям, связанным с работой периферийных модулей STM32, назначены отдельные источники прерываний с соответствующими порядковыми номерами. Номера прерываний IRQn для микроконтроллеров определённой подгруппы объявлены в разделе "STM32 specific Interrupt Numbers” заголовочного файла "stm32F10x.h":
Большинству
источников прерываний IRQ сопоставлены несколько событий, связанных с работой
конкретного периферийного блока. Так, например, прерывание по каналу USART может
быть вызвано при переносе принятого байта в приёмный буфер (флаг RXNE=1), по
готовности передающего буфера к приёму нового байта для отправки (TXE=1) и так далее.
При этом должны быть установлены флаги разрешения запросов на прерывания по выбранным событиям,
а какое из них стало причиной вызова по данному источнику можно
определить в обработчике по состоянию соответствующих флагов.
Например, разрешение запросов на прерывание по завершению приёма и передачи кадра USART1:
USART1->CR1 |=USART_CR1_TCIE | USART_CR1_RXNEIE; // Разрешить запросы по флагам TC и RXNE.
|
При возникновении события и установленном флаге разрешения запроса на прерывание, соответствующий обработчик будет вызван сразу, если данный источник уже разрешён, или непосредственно после его разрешения в NVIC.
§
|
> Разрешение и запрет вызова прерываний. |
Модуль NVIC, как часть архитектуры Cortex M3, описан в документе:
Регистры разрешения прерываний (Interrupt set-enable registers) NVIC_ISER0, NVIC_ISER1 и NVIC_ISER2 в стандартном файле определений для периферии "stm32F10x.h" объявлены как массив из трёх элементов ISER[3]. Таким образом для разрешения конкретного прерывания необходимо установить соответствующий ему бит в одном из элементов-регистров указанного массива.
Регистры разрешения прерываний NVIC_ISERx
Аналогичная структура и принцип управления применим для регистров запрета прерываний NVIC_ICERx - установка конкретного бита в регистрах массива ICER[] запрещает вызов соответствующего прерывания.
NVIC_EnableIRQ (RTC_IRQn); // Разрешить прерывания от RTC в NVIC.
NVIC_DisableIRQ (RTC_IRQn); // Запретить прерывания от RTC в NVIC. |
Глобальный запрет и разрешение векторизированных прерываний осуществляется вызовом функций:
__disable_irq (); //
Запретить
прерывания IRQ.
__enable_irq (); //
Разрешить прерывания
IRQ. |
§
|
> Приоритеты прерываний IRQ. |
По-умолчанию, при сброшенных битах группировки приоритетов прерываний AIRCR[10:8] (состояние после перезагрузки), каждому из прерываний может быть назначен собственный приоритет от 0 до 15. При этом прерывания будут обрабатываться по следующим правилам:
- вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;
- выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета.
- при одновременном вызове, несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания.
Функция CMSIS (из core_cm3.h) для задания приоритета без назначения групп приоритетности:
NVIC_SetPriority (USART1_IRQn, 15); // Назначить прерываниям от USART1 самый низкий проритет.
|
Для задания приоритета источника прерывания STM32 предназначены двадцать 32-х разрядных регистров NVIC__IPRx, где каждый из байтов соответствует конкретному источнику. Стандарт CMSIS определяет байты внутри указанных регистров как элементы массива от IP[0] до IP[80].
Значение приоритета задаётся комбинацией битов [7:4] байтов IP[IRQn].
По состоянию после сброса для всех прерываний IRQ назначен наивысший приоритет (0).
§
|
> Группы и подгруппы приоритетов прерываний. |
Ненулевое значение битов [10:8] регистра AIRCR позволяет определить группы приоритетов и задать их количество, при этом значение:
AIRCR[10:8] = 3 (011) - битами G задаёт 16 групп приоритетов: GGGG;
AIRCR[10:8] = 4 (100) - битами G и S определяет 8 групп и 2 подгруппы приоритетов SGGG;
AIRCR[10:8] = 5 (101) - 4 группы с 4 подгруппами SSGG;
AIRCR[10:8] = 6 (110) - 2 группы с 8 подгруппами SSSG;
AIRCR[10:8] = 7 (111) - 16 подгрупп SSSS.
здесь: G и S -биты [7:4] регистров приоритетов IP[IRQn], определяющие принадлежность к группе и подгруппе.
При инициализации системы приоритетов с делением на группы изменяются правила обработки прерываний:
- только приоритет группы определяет последовательность обработки прерываний; когда процессор выполняет обработку прерывания, то другое прерывание с этим же приоритетом группы не прервет обработку первоначального обработчика.
- при множественном возникновении прерываний имеющих одинаковый приоритет группы, подприоритеты определяют последовательность их обработки.
- при множественном возникновении прерываний с одинаковым приоритетом группы и подприоритетом первым обрабатывается прерывание с меньшим номером.