Начало работы с STM32: управление приоритетами прерываний NVIC

встроенный

Знания, связанные с приоритетом прерывания STM32

Cortex-M3 Core поддерживает 256 прерывания, который содержит 16 основных прерываний (исключений) и 240 внешних прерываний, а также имеет 256 программируемых настроек прерывания. Однако STM32 использует не все ядро ​​CM3, а только его часть.STM32 имеет 84 прерывания., в том числе 16 прерываний ядра (исключений) и 68 маскируемых прерываний, сУровень 16Программируемый приоритет прерывания. В серии STM32F103 16 основных прерываний (исключений) остаются без изменений, в то время какВсего 60 маскируемых прерываний (68 в серии 107).

Примечание: внешнее прерывание CM3 и внешнее прерывание STM32 — это не одно и то же. CM3: все внешние прерывания, кроме исключений ядра; STM32: только 6 внешних прерываний EXTI (?)

На самом деле прерывания ядра также называются исключениями ядра. (?)

  • Прерывание означает, что система останавливает текущую программу и обращается к другим службам.Возможно, программа получила запрос с более высоким приоритетом, чем она сама, или прерывание установлено искусственно.Прерывание является нормальным явлением.
  • Исключения относятся к ошибкам, вызванным сбоями ЦП, программными сбоями или запросами на обслуживание.Исключения — это ненормальные явления.

Где-то срабатывает исключение или прерывание, и указатель счетчика программ (ПК) перейдет на адрес исключения или прерывания для выполнения, где хранится инструкция перехода, и перейдет к служебной функции исключения или прерывания для выполнения соответствующее исполнение.функция. Следовательно, таблицы векторов исключений и прерываний могут быть написаны только на языке ассемблера.

В МДК,Существует стандартный файл таблицы векторов исключений и прерываний, который можно использовать (startup_stm32f10x_hd.s), в котором имя обработчика прерывания помечено и не может быть определено произвольно. Канал прерывания NVIC_IRQChannel (т.е. тип IRQn_Type) является макросом, определенным в файле stm32f10x.h.

чтоNVIC,СейчасВложенный векторный контроллер прерываний(Контроллер вложенных векторных прерываний). В CM3 есть мощный и удобный NVIC, который является устройством, принадлежащим ядру Cortex, и все 60 прерываний в таблице векторов прерываний обрабатываются им.

Основными функциями NVIC являются группировка приоритета прерывания, настройка приоритета прерывания, чтение флагов запроса на прерывание, очистка флагов запроса на прерывание, включение прерываний, очистка прерываний и т. д. Он контролирует 60 из номеров прерываний 0–59 в таблице векторов прерываний STM32. прерывание! ! Внешний сигнал прерывания отправляется из-за пределов ядра, и, наконец, сигнал передается в NVIC (контроллер вложенных векторных прерываний). NVIC тесно связана с ядром и управляет функциями всего чипа, связанными с прерываниями.

Группировка приоритетов прерываний NVIC

STM32 делит прерывания на 5 групп, группы 0-4, при этом на каждое прерывание ставим по одномуупреждающий приоритетиприоритет ответа. Конфигурация группировки определяется битами 10-8 регистра SCB->AIRCR.Через эту таблицу вы можете ясно увидеть отношения конфигурации, соответствующие группам 0-4.Например, если группа установлена ​​​​на 3, то для всех 60 прерываний в это время старшие 3 бита старших четырех битов прерывания регистр приоритета каждого прерывания: приоритет приоритета, младший 1 бит - приоритет ответа. Для каждого прерывания можно установить приоритет прерывания равным 0.7 07. Приоритет ответа 1 или 0, всего 16 уровней.

Приоритет вытеснения выше, чем приоритет ответа, и чем меньше значение, тем выше приоритет.

Разница между приоритетом упреждения и приоритетом ответа

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

Прерванная ситуация связана только с приоритетом вытеснения, а не приоритетом ответа! В общем, во время выполнения системного кода,Устанавливайте группу приоритетов прерываний только один раз, такие как группа 2, после того, как группа установлена, группа обычно не изменяется. Произвольное изменение группировки приведет к путанице в управлении прерываниями и неожиданным результатам выполнения программы.

Установка приоритета прерывания NVIC

Используйте функцию NVIC_Init() для установки приоритета каждого прерывания.(в файле misc.c)

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
  uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
  
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
    
  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  {
    /* Compute the Corresponding IRQ Priority --------------------------------*/    
    tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
    tmppre = (0x4 - tmppriority);
    tmpsub = tmpsub >> tmppriority;

    tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
    tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
    tmppriority = tmppriority << 0x04;
        
    NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
    
    /* Enable the Selected IRQ Channels --------------------------------------*/
    NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
  else
  {
    /* Disable the Selected IRQ Channels -------------------------------------*/
    NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
}

NVIC_InitTypeDefСтруктура определяется следующим образом:

typedef struct
{
  uint8_t NVIC_IRQChannel;
  uint8_t NVIC_IRQChannelPreemptionPriority;
  uint8_t NVIC_IRQChannelSubPriority;       
  FunctionalState NVIC_IRQChannelCmd;        
} NVIC_InitTypeDef;

Структура NVIC_InitTypeDef имеет 4 переменных-члена:

  • NVIC_IRQканал:Определите, какое прерывание инициализируется, имя каждого прерывания можно найти в файле stm32f10x.h, например USART1_IRQn;
  • NVIC_IRQChannelPreemptionPriority:Определяет уровень приоритета прерывания для этого прерывания;
  • NVIC_IRQChannelSubPriority:Определите уровень приоритета ответа для этого прерывания;
  • NVIC_IRQChannelCmd:Разрешено ли прерывание.

Например, чтобы разрешить прерывание последовательного порта 1, приоритет вытеснения равен 1, а приоритет ответа — 2. Метод инициализации:

NVIC_InitTypeDef   NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);	//根据上面指定的参数初始化NVIC寄存器

проблема

  1. Прерывание ядра и исключение ядра - это концепция?
  2. Что такое внешнее прерывание STM32 и что такое внешнее прерывание CM3?
  3. Где устанавливается функция ответа на прерывание?
  4. Прервать конкретную реализацию?

использованная литература

  1. [STM32] Управление приоритетами прерываний NVIC (таблица векторов прерываний)
  2. [Punctual Atom] Обучение обучению микроконтроллеру STM32 обучающее видео