:::: MENU ::::

Примеры использования StdPeriph — Прерывания

В данной серии статей будут приведены примеры работы с периферией STM32L с помощью библиотеки, предоставляемой ST — StdPeriph. Перед использованием примеров не забывайте включать, соответствующие файлы библиотеки в проект.

Прерывания

void nvic_usart_1(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
    NVIC_Init(&NVIC_InitStructure);
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);
    
}

void USART1_IRQHandler(void)
{
    if(USART_GetFlagStatus(USART1, USART_IT_RXNE))
    {
        USART_ClearFlag(USART1, USART_IT_RXNE);
    }
    
    if(USART_GetFlagStatus(USART1, USART_IT_TC))
    {
        USART_ClearFlag(USART1, USART_IT_TC);
                //USART1->SR = ~0x40; - при не срабатывании стр. выше
    }
}

Прерывание по Pin

  1. Разрешаем тактирование SYSCONFIG.

  2. Снимаем маску с необходимой линии прерывания.
    Т.е. получаем настроенными на прерывания ноги 0 со всех портов, если хотим использовать, допустим PC0 — см. DataSheet.

  3. Настраиваем по фронту или срезу, по какому перепаду уровня хотим получать срабатывание.

  4. Выбираем на какой порт настраиваем прерывание.

exti_reg

  1. Разрешаем прерывания и устанавливаем их приоритет.

ПРИМЕР


GPIO_InitTypeDef GPIO_InitStructure; 
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
    
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //(_OUT, _AF, _AN)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; //(_2MHz, _10MHz, 40MHz)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //(_0 ... _15)
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14); 
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
    
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); 

void EXTI15_10_IRQHandler(void)
{ 
  if(EXTI_GetITStatus(EXTI_Line14) != RESET)
  {
    EXTI_ClearITPendingBit(EXTI_Line14);
  }
}

Контроллер поддерживает вложенные прерывания, когда внутри одного обработчика может возникнуть другое прерывание. В связи с этим каждый источник прерывания имеет свой приоритет. Поддерживается 16 уровней приоритетов прерываний.
Наивысшие значения приоритетов имеют векторы прерываний ядра Cortex-M3.
Три самых высоких уровня прерываний закреплены за векторами жестко и не могут быть изменены :


Номер   Обработчик     Приоритет      Описание
1   Reset_Handler     -3(наивысший)   Вектор сброса
2   NMI_Handler   -2              Немаскируемое прерывание
3   HardFault_Handler -1              Аварийные состояния

Всем остальным векторам прерываний могут быть назначены уровни приоритета от 0 до 15.
Высшему уровню приоритета соответствует меньшее его значение. Уровень приоритета можно назначить не только отдельному вектору, но и целой группе векторов. Такая возможность упрощает работу с большим количеством векторов прерываний.

Для установки группы приоритетов используется функция из библиотеки:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

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

Название группы приоритетов  Количество приоритетов    Количество субприоритетов

NVIC_PriorityGroup_0    0   16
NVIC_PriorityGroup_1    2   8
NVIC_PriorityGroup_2    4   4
NVIC_PriorityGroup_3    8   2
NVIC_PriorityGroup_4    16  0