Знания, связанные с приоритетом прерывания 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寄存器
проблема
- Прерывание ядра и исключение ядра - это концепция?
- Что такое внешнее прерывание STM32 и что такое внешнее прерывание CM3?
- Где устанавливается функция ответа на прерывание?
- Прервать конкретную реализацию?