В данной серии статей будут приведены примеры работы с периферией STM32L с помощью библиотеки, предоставляемой ST — StdPeriph. Перед использованием примеров не забывайте включать, соответствующие файлы библиотеки в проект.
- Порты GPIOx
- Прерывания
- Timer 6
- USART
- I2C
- SPI
- DMA
- Системный таймер
- EEPROM
- RTC
- Тактирование 32МГц с настройкой пропуска такта flash
Прерывания
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
- Разрешаем тактирование SYSCONFIG.
-
Снимаем маску с необходимой линии прерывания.
Т.е. получаем настроенными на прерывания ноги 0 со всех портов, если хотим использовать, допустим PC0 — см. DataSheet. -
Настраиваем по фронту или срезу, по какому перепаду уровня хотим получать срабатывание.
-
Выбираем на какой порт настраиваем прерывание.
- Разрешаем прерывания и устанавливаем их приоритет.
ПРИМЕР
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