Контроллер вложенных векторизированных прерываний STM32 (Nested vectored interrupt controller (NVIC)), в зависимости от модели микроконтроллера, способен обслуживать до 68 источников прерываний IRQ от периферийных модулей микроконтроллера и осуществлять:

  •  разрешение и запрет вызова прерываний;
  •  назначение и динамическое изменение приоритета прерываний (16 уровней от 0 (максимального) до 15);
  •  автоматическое сохранение и восстановление контекста данных при обработке одиночных и вложенных прерываний;
  •  при одновременном вызове, механизм отложенных прерываний позволяет отложить обработку менее приоритетного прерывания, без возврата в фон и восстановления контекста данных.

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

Определённым событиям, связанным с работой периферийных модулей STM32, назначены отдельные источники прерываний с соответствующими порядковыми номерами. Номера прерываний IRQn для микроконтроллеров определённой подгруппы объявлены в разделе “_STM32 specific Interrupt Numbers_” заголовочного файла “stm32F10x.h“:

WWDG_IRQn = 0, // Window WatchDog Interrupt.
...
TIM7_IRQn = 55, // TIM7 Interrupt.

stm32F10x.h

Стандартный файл startup в виде заголовков функций-обработчиков задаёт адреса переходов при вызове соответствующих прерываний:

DCD WWDG_IRQHandler ; Window Watchdog.
...
DCD TIM7_IRQHandler ; TIM7.

startup подсемейства “Medium density value line” для IARstartup_stm32f10x_md_vl.s (для использования сотрите .txt в названии файла)

События, генерирующие запросы на перывания

Большинству источников прерываний IRQ сопоставлены несколько событий, связанных с работой конкретного периферийного блока. Так, например, прерывание по каналу USART может быть вызвано при переносе принятого байта в приёмный буфер (флаг RXNE=1), по готовности передающего буфера к приёму нового байта для отправки (TXE=1) и так далее. При этом должны быть установлены флаги разрешения запросов на прерывания по выбранным событиям, а какое из них стало причиной вызова по данному источнику можно определить в обработчике по состоянию соответствующих флагов.

Например, разрешение запросов на прерывание по завершению приёма и передачи кадра USART1:

USART1->CR1 |=USART_CR1_TCIE | USART_CR1_RXNEIE; // Разрешить запросы по флагам TC и RXNE.

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

Разрешение и запрет вызова прерываний.

Модуль NVIC, как часть архитектуры Cortex-M3, описан в документе: “STM32F10xxx Cortex-M3 programming manual”.

Регистры разрешения прерываний (Interrupt set-enable registers) _NVICISER0, _NVICISER1 и _NVICISER2 в стандартном файле определений для периферии “stm32F10x.h”; объявлены как массив из трёх элементов ISER3. Таким образом для разрешения конкретного прерывания необходимо установить соответствующий ему бит в одном из элементов-регистров указанного массива.

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

ISER0

Аналогичная структура и принцип управления применим для регистров запрета прерываний _NVICICERx — установка конкретного бита в регистрах массива ICER[] запрещает вызов соответствующего прерывания.

Функции  CMSIS для разрешения и запрета вызова IRQ в NVIC:

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], определяющие принадлежность к группе и подгруппе.

При инициализации системы приоритетов с делением на группы изменяются правила обработки прерываний:

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

_Источник: Программирование STM32. Часть 3. Система прерываний_

 

 

Следующая часть:  Программирование STM32. Часть 4. Внешние прерывания EXTI

Предыдущая часть:  Программирование STM32. Часть 2. Система тактирования STM32

Комментарии

comments powered by Disqus