Getting started with EXTI

This article explains the EXTI and its use, with examples.

1 External interrupt/event controller (EXTI)

The external interrupt/event controller consists of up to 23 edge detectors for generating event/interrupt requests. Each input line can be independently configured to select the type (interrupt or event) and the corresponding trigger event (rising, falling, or both).

2 Configure EXTI to turn on an LED when a user button is pressed

2.1 Objective

  • Set up an input pin with EXTI in STM32CubeMX
  • Generate code in STM32CubeMX and use HAL functions.

2.2 How

  • Configure a GPIO and EXTI pin in STM32CubeMX and generate code
  • Add into a project: a callback function, and a function to turn on an LED
  • Verify the correct functionality by pressing a button that turns on an LED.

2.3 Create project in STM32CubeMX

  • Menu > File > New Project
  • Select STM32F439ZITx

File:Select F439.png

  • Configure an LED pin as GPIO_Output (PG14 on NucleoF439ZI). For other boards check their user manual.

File:LED UM.png File:LED PIN.png

  • Configure a button pin as GPIO_EXTIX (PA0 on NucleoF439ZI). For other boards check their user manual.

File:Button.png

  • GPIO configuration check
  • Enable the interrupt for EXTI
  • Save your project and generate the code for your IDE.

2.4 HAL Library workflow summary

File:EXTI HAL flowchart.png

2.5 Open your IDE

Create a function to handle the EXTI interrupts:

  • HAL callback function for EXTI: void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  • To turn an LED on we need to use the function: HAL_GPIO_WritePin

Put the functions into main.c

Info white.png Information
Between /* USER CODE BEGIN 4 */ and /* USER CODE END 4 */ tags
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_0) {
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_SET);
  } else {
      __NOP();
  }
}
/* USER CODE END 4 */

2.6 Compile and Flash

Compile the above code, then load it to the board Flash memory.

  • When you press the blue button on your board the LED should switch on.