NVIC поддерживает 16 различных уровней приоритетов и субприоритетов, поддерживаемых 4 битами, которые разделены между этими двумя функциями. Прерывания с разными приоритетами могут вытеснять друг друга (приоритеты с меньшим числом имеют приоритет), в то время как подчиненные приоритеты в пределах одного приоритета влияют только на выбор прерывания, принятого, когда два или более ожидают рассмотрения. Для примеров мы используем 0 битов для приоритета. В дальнейшем мы обсудим FreeRTOS, операционную систему реального времени, которая требует использования 4 битов для приоритета .
#include <misc.h> /* * NVIC_PriorityGroup_0 0 bits priority , 4 bits subgroup * NVIC_PriorityGroup_1 1 bits priority , 3 bits subgroup * NVIC_PriorityGroup_2 2 bits priority , 2 bits subgroup * NVIC_PriorityGroup_3 3 bits priority , 1 bits subgroup * NVIC_PriorityGroup_4 4 bits priority , 0 bits subgroup */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
Следующий фрагмент кода настраивает и включает прерывание TIM2. Обратите внимание, что это должно соответствовать любой конфигурации устройства!
NVIC_InitTypeDef NVIC_InitStructure; // No StructInit call in API NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
Номер IRQChannel может зависеть от устройства. Они определены в stm32f10x.h, к которому вы можете обратиться за правильным именем константы — не копируйте значение константы в ваш код! Обратите внимание, что этот заголовочный файл зависит от конкретных определений устройства.