Пишем программный код для использования внешнего прерывание микроконтроллера STM32F103 в среде программирования Keil uVision.

В данном уроке мы рассмотрим внешнее прерывание по входному сигналу на ножке микроконтроллера. 

Для начало рассмотрим количество прерываний по ножкам:  существует всего семь обработчиков внешних прерываний: EXTI0EXTI1EXTI2EXTI3EXTI4EXTI9_5EXTI15_10. Как мы видим, что не все ножки имеют свое личное прерывание, часть ножек объединены общим прерыванием.

Так как мы в данном уроке будем использовать HAL библиотеку, нам нет необходимости заботиться о правильности выбора номера прерывания, обработки и сброса флага прерывания.
ФункциHAL_GPIO_EXTI_Callback решает все данные задачи, ее синтаксис:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){// функция обрабатывающая прерывание
if (GPIO_Pin==GPIO_PIN_N){// проверяем по какой ножке произошло прерывание
     //***Ваш код****
     } 
}

где: N — номер ножки. 

Единственный подводный камень, это ножка на которой настроено прерывание:

Как мы видим c документации, если мы захотим настроить прерывание EXTI1 на первой ножке порта А и первой ножке порта В, у нас не чего не выйдет, так оба порта используют один и тот же номер прерывания.

Для проверки работы прерывания мы воспользуемся ножкой PB14.

   Кнопка подключена к ножке РВ14  и на землю. К ножка РВ13 и РВ12 подключены светодиоды. 

   В программе STM32CubeMX включаем ножки РВ12 и РВ13 на выход, а РВ14 на вход с прерыванием:
   Прерывание настраиваем на срабатывание на нижний фронт, при этом вывод РВ14 подтягиваем к питанию:
Для проверки работы прерывания, у нас один светодиод будет постоянно мигать (симулируя работу программного кода), а второй светодиод будет менять свое состояние при нажатии кнопки.
Программный код:

/* USER CODE BEGIN PFP */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){// функция обрабатывающая прерывание
if (GPIO_Pin==GPIO_PIN_14){// проверяем по какой ножке произошло прерывание
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
}
}
/* USER CODE END PFP */

 

/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_Delay(1000);
}
/* USER CODE END 3 */