Поговорим сегодня про одну из важны тем в изучении микроконтроллеров STM32 — прерывания. Рассмотрим примеры настройки и как использовать прерывания HAL STM32 на практике. Программный код будет представлен для Cube IDE, вся настройка прерываний будет в Cube MX.
Если говорить по простому, то прерывания это какое либо событие произошедшее с контроллером, требующие первоочередной обработки. Например появление единицы на ножке микроконтроллера, если это внешнее прерывание. Или прием данных по UART или SPI интерфейсам.
Обработка прерываний STM32
В STM32 обработка прерываний одинакова для всех видов прерываний. Алгоритм работы одинаковый.
- Выбрать нужное прерывание (внешние или от периферии)
- Активировать данное прерывание в CubeMX
- Активировать функцию Callback
- Написать обработчик прерывания
Рассмотрим подробнее данный алгоритм на примере внешнего прерывания. Генерировать его будет кнопка подключенная к PC4. Какой контроллер говорить не буду, так как для всех алгоритм обработки прерываний одинаков.
Внешние прерывания HAL
Чтобы назначить на ножку микроконтроллера внешнее прерывание, необходимо в CubeMX выбрать нужную ножку, нажать на ней левой клавишей мышки и выбрать из списка GPIO_EXTIx, ult X — номер контакта:
После этого, на вкладке System Core -> NVIC появится строка EXTI line4 interrupt. Необходимо установить галочку в этой строчке. Этим действием, мы указываем, что будем использовать внешние прерывание на 4 линии. В STM32 имеется возможность подключить до 16 внешних прерываний. При выборе нескольких прерываний может появится строчка: EXTI line[9:5] interrupts.
ВНИМАНИЕ! Если активировать прерывание на любой линии одновременно на разных портах, то STM32 не сможет их распознать. Например: STM32 не поймет если подключить кнопки на PC4, PD4 и PA4. Для этих портов будет одно и тоже внешнее прерывание EXTI line4 interrupt. Что бы все работало можно подключить кнопки например так: PC1,PD2,PA3 и активировать прерывания на этих линиях.
После этого нам необходимо включить функцию Callback. Для этого необходимо перейти на вкладку Project Manager -> Advanced Settings и на против EXTI выбрать ENABLE:
Вот и все, мы настроили работу нашего внешнего прерывания. Включаем генерацию кода и переходим к обработчику нашего прерывания. Ниже разберем как использовать прерывания HAL STM32 на практике.
Пример работы с внешним прерыванием STM32
Функция Callback отмечена как __weak ‘void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) это значит, что эту функцию можно переопределить пользователем. Описана функция в модуле stm32f1xx_hal_gpio.c.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_4) { // Выполняем необходимый код } }
В следующих статьях рассмотрим прерывания от периферии, такие как SPI, UART, Таймеры и др.
Aliexpress