STM32F407 GPIO Configuration

By iLabTek Team
April 2026
25 min read
Intermediate

Introduction

GPIO (General Purpose Input Output) is one of the most fundamental peripherals in any microcontroller. Understanding GPIO programming is essential for embedded systems development because almost every hardware component interacts through GPIO pins. In this comprehensive tutorial, we'll explore STM32F407 GPIO configuration in detail using STM32CubeIDE, HAL libraries, and practical examples.

What You'll Learn

This tutorial covers GPIO configuration, modes, clock management, HAL-based programming, interrupt handling, and register-level understanding with complete practical examples.

1. Introduction to STM32F407

The STM32F407 belongs to the STM32F4 family from STMicroelectronics and is based on the ARM Cortex-M4 processor core. This microcontroller is widely used in industrial applications, consumer electronics, and embedded systems.

Feature Description
CPU ARM Cortex-M4
Clock Speed Up to 168 MHz
Flash Memory Up to 1 MB
SRAM 192 KB
GPIO Pins Multiple configurable GPIO ports
Communication UART, SPI, I2C, CAN, USB, Ethernet
ADC/DAC High-speed analog peripherals

Popular Development Boards

  • STM32F407 Discovery Board (STM32F4DISCOVERY)
  • STM32F4 Nucleo Board
  • Custom boards with STM32F407

2. What is GPIO?

GPIO stands for General Purpose Input Output. GPIO pins are the most versatile digital I/O interfaces available on microcontrollers. They can be configured for multiple operations:

Mode Purpose Examples
Input Read external signals Buttons, sensors, switches
Output Control external devices LEDs, relays, buzzers
Alternate Function Peripheral interface UART, SPI, I2C, PWM
Analog Analog signal processing ADC input, DAC output
Interrupt Event detection Button press, edge detection

3. STM32F407 GPIO Architecture

The STM32F407 features multiple GPIO ports labeled GPIOA through GPIOI, each containing up to 16 pins (Pin0 to Pin15). This allows for extensive I/O capabilities.

GPIO Ports and Pins

Port Pin Range Total Pins
GPIOA PA0 – PA15 16
GPIOB PB0 – PB15 16
GPIOC PC0 – PC15 16
GPIOD PD0 – PD15 16
GPIOE - GPIOI PE0-PE15, PF0-PF15, etc. Up to 16 each

GPIO Pin Structure

Each GPIO pin contains several internal components:

  • Input Buffer: Reads external voltage levels
  • Output Driver: Drives external loads
  • Pull-up/Pull-down Resistors: Internal resistors to define default states
  • Alternate Function Multiplexer: Routes pin to different peripherals
  • Analog Switch: Connects to analog circuitry for ADC/DAC

4. Important GPIO Registers

STM32F407 GPIO configuration is controlled using specific registers. Understanding these registers is crucial for both HAL and register-level programming.

Register Full Name Purpose
MODER Mode Register Select GPIO mode (input/output/alternate/analog)
OTYPER Output Type Register Push-Pull or Open-Drain output
OSPEEDR Output Speed Register Output speed configuration
PUPDR Pull-up/Pull-down Register Internal resistor configuration
IDR Input Data Register Read input pin states
ODR Output Data Register Write output pin states
BSRR Bit Set/Reset Register Atomic bit operations
AFRL/AFRH Alternate Function Registers Select alternate function for pins

5. GPIO Modes in STM32F407

Input Mode

Used to read signals from external components such as switches, sensors, and buttons. Input mode is essential for applications requiring user interaction or sensor feedback.

Output Mode

Used to control external devices like LEDs, relays, buzzers, and motors. Output pins can either drive low or high logic levels to control external hardware.

Alternate Function Mode

Allows GPIO pins to be controlled by peripheral modules like UART, SPI, I2C, and Timer peripherals.

Peripheral Alternate Function Application
UART TX/RX Serial communication
SPI MOSI/MISO/SCK High-speed data transfer
I2C SDA/SCL Two-wire communication
Timer PWM Pulse Width Modulation

Analog Mode

Used for ADC (Analog-to-Digital Converter) input and DAC (Digital-to-Analog Converter) output, allowing the microcontroller to process analog signals.

6. GPIO Clock Enable

Before using any GPIO pin, the peripheral clock for that GPIO port must be enabled. This is a critical step that many beginners forget.

// Enable GPIOA peripheral clock __HAL_RCC_GPIOA_CLK_ENABLE(); // Enable GPIOB peripheral clock __HAL_RCC_GPIOB_CLK_ENABLE(); // Without enabling the clock, GPIO registers will not work!
Important Note

Forgetting to enable the GPIO clock is a common mistake that causes GPIO to remain non-functional. Always enable the clock for the GPIO port before configuring pins.

7. GPIO Configuration Using STM32CubeIDE

Creating a New STM32 Project

Step 1: Open STM32CubeIDE Launch STM32CubeIDE from your desktop or applications folder.
Step 2: Create New Project Navigate to: File → New → STM32 Project
Step 3: Select Microcontroller Search for and select STM32F407VG or choose STM32F407 Discovery Board
Step 4: Project Settings Configure project name, location, and initial settings
Step 5: Generate Code Click: Project → Generate Code

GPIO Pin Configuration in CubeMX View

  1. In the Pinout view, left-click on a pin (e.g., PA5)
  2. Select the desired function from the dropdown menu
  3. Choose GPIO_Output for output mode
  4. Verify the configuration in the left settings panel
  5. Generate code automatically

8. GPIO Output Configuration

GPIO_InitTypeDef Structure

HAL uses the GPIO_InitTypeDef structure to configure GPIO parameters:

GPIO_InitTypeDef GPIO_InitStruct = {0}; // Pin selection GPIO_InitStruct.Pin = GPIO_PIN_5; // Mode selection GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Pull configuration GPIO_InitStruct.Pull = GPIO_NOPULL; // Speed configuration GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Initialize GPIO HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Important GPIO Parameters

Pin Selection

Specify which pins to configure using GPIO_PIN_0 through GPIO_PIN_15, or combine multiple pins with bitwise OR: (GPIO_PIN_5 | GPIO_PIN_6)

Mode Selection

Options: GPIO_MODE_INPUT, GPIO_MODE_OUTPUT_PP, GPIO_MODE_OUTPUT_OD, GPIO_MODE_AF_PP, GPIO_MODE_AF_OD, GPIO_MODE_ANALOG, GPIO_MODE_IT_RISING, GPIO_MODE_IT_FALLING, GPIO_MODE_IT_RISING_FALLING

Pull Configuration

Options: GPIO_NOPULL (no resistor), GPIO_PULLUP (internal pull-up), GPIO_PULLDOWN (internal pull-down)

Complete LED Blink Example

#include "main.h" int main(void) { HAL_Init(); SystemClock_Config(); // Enable GPIOA peripheral clock __HAL_RCC_GPIOA_CLK_ENABLE(); // Configure GPIO structure GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Initialize GPIO HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Main loop while(1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(500); // 500ms delay } return 0; }

Understanding the LED Blink Code

  • HAL_Init(): Initializes Flash interface, SysTick timer, and HAL library
  • __HAL_RCC_GPIOA_CLK_ENABLE(): Enables GPIOA peripheral clock
  • GPIO_InitTypeDef: Declares GPIO configuration structure
  • HAL_GPIO_Init(): Applies configuration to GPIO port
  • HAL_GPIO_TogglePin(): Switches LED state (on to off, off to on)
  • HAL_Delay(): Creates delay in milliseconds

9. GPIO Input Configuration

Push Button Interface

A common practical example is reading a push button connected to PA0, with an LED on PA5 controlled by the button:

Hardware Setup Connect push button between PA0 and GND. Connect LED with current-limiting resistor between PA5 and VCC.

Input Configuration Code

// Configure PA0 as input with pull-up GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Reading GPIO Input

// In main loop if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { // Button is pressed (active low) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); } else { // Button is released HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); }
GPIO Pin States

GPIO_PIN_SET = HIGH (Logic 1), GPIO_PIN_RESET = LOW (Logic 0)

10. GPIO Output Types and Alternate Functions

Output Types

Type Description Usage
Push-Pull (PP) Standard CMOS output LEDs, general digital outputs
Open-Drain (OD) Only pulls low, requires external pull-up I2C, multi-master buses

GPIO Speed Configuration

Speed Level Typical Usage
GPIO_SPEED_FREQ_LOW LEDs, buttons (slow I/O)
GPIO_SPEED_FREQ_MEDIUM General peripherals
GPIO_SPEED_FREQ_HIGH SPI, fast communication
GPIO_SPEED_FREQ_VERY_HIGH High-frequency signals, USB

Alternate Function Configuration Example (UART)

// Configure UART on PA2 (TX) and PA3 (RX) GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

11. GPIO Interrupt Configuration

GPIO interrupts allow the microcontroller to respond immediately to events without continuous polling, improving efficiency and responsiveness.

Setting Up GPIO Interrupts

// Configure PA0 for falling edge interrupt GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Enable NVIC interrupt for EXTI0 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);

GPIO Interrupt Callback Function

// This function is called when GPIO interrupt occurs void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { // Button pressed - toggle LED HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } }

12. Direct Register-Level GPIO Programming

For advanced users, GPIO can be controlled directly using registers for lower-level control and optimization:

// Enable clock using RCC register RCC->AHB1ENR |= (1 << 0); // Enable GPIOA clock // Set PA5 as output using MODER register GPIOA->MODER |= (1 << 10); // Set PA5 output high GPIOA->ODR |= (1 << 5); // Toggle PA5 using XOR GPIOA->ODR ^= (1 << 5); // Read PA0 input uint8_t pin_state = (GPIOA->IDR >> 0) & 1;

HAL vs Register Programming

Aspect HAL Library Register Level
Ease of Use Easy and beginner-friendly Requires deep hardware knowledge
Execution Speed Slightly slower (more abstraction) Faster and optimized
Code Size Larger due to library overhead Smaller and compact
Portability Portable across STM32 variants Hardware specific

13. Practical GPIO Applications

LED Control

  • Status indication and debugging
  • Visual feedback to users
  • Simple GPIO output practice

Switch Interface

  • Reading user input (buttons, switches)
  • Implementing menu navigation
  • GPIO input and debouncing techniques

Relay Control

  • Controlling high-power devices
  • Industrial automation applications
  • Using transistors or relay drivers

Sensor Interface

  • Connecting digital sensors (PIR, IR, ultrasonic)
  • GPIO interrupt for event detection
  • Real-time data acquisition

Motor Driver Control

  • Direction control pins
  • Enable/disable pins
  • PWM integration with GPIO

Conclusion

GPIO programming is the foundation of embedded systems development. Mastering STM32F407 GPIO configuration opens doors to implementing:

  • IoT devices and sensors
  • Robotics systems with motor control
  • Industrial controllers and automation
  • Automotive electronics
  • Smart sensor systems

With STM32CubeIDE and HAL libraries, GPIO programming is accessible to everyone from beginners to advanced developers. Remember to always enable clocks, configure parameters correctly, and test thoroughly with hardware.

Next Steps

Now that you understand GPIO, explore advanced peripherals like UART, SPI, I2C, ADC, PWM timers, and RTOS-based applications. Build small projects to solidify your understanding and gradually increase complexity.

Related Tutorials

Introduction to ARM Cortex-M4

Get started with ARM Cortex-M4 architecture and instruction set fundamentals.

Read Tutorial →

Timer Configuration & Interrupts

Master timer peripherals and interrupt handling in STM32.

Read Tutorial →
Read Tutorial →
+91 9773864270