Getting started with GPIO

Revision as of 15:06, 9 December 2022 by Registered User

This article explains what GPIO is and how to use it through examples

1. What is a general purpose input output (GPIO)

GPIO stands for general purpose input/output. It is a type of pin found on an integrated circuit that does not have a specific function. While most pins have a dedicated purpose, such as sending a signal to a certain component, the function of a GPIO pin is customizable and can be controlled by the software.

  • Pin Mode : Each port bit of the general-purpose I/O (GPIO) ports can be individually configured by software in several modes:
    • input or output
    • analog
    • alternate function (AF).
  • Pin characteristics :
    • Input : no pull-up and no pull-down or pull-up or pull-down
    • Output : push-pull or open-drain with pull-up or pull-down capability
    • Alternate function : push-pull or open-drain with pull-up or pull-down capability

GPIO Functional description graph.png

1.1. GPIO (pin) output-speed configuration

  • Change the rising and falling edge when the pin state changes from high to low or low to high.
  • A higher GPIO speed increases the EMI noise from STM32 and increases the STM32 consumption.
  • It is good to adapt the GPIO speed to the peripheral speed. For example, low speed is optimal for toggling GPIO at 1 Hz, while using SPI at 45 MHz requires very high speed setting.

File:GPIO8.png


2. Configure GPIO for LED toggling

2.1. Objective

Learn how to Toggle a pin on STM32L476 Nucleo board using Hardware Abstraction Layer (HAL) library and learn how to setup the pin and GPIO port in STM32CubeIDE

2.2. Create the project in STM32CubeIDE

  • File > New > STM32 Project in main panel.

create STM32CubeIDE project.png

In this example the NUCLEO-L476RG board is used.

  • Select NUCLEO-L476RG board using Board Selector as shown in the figure below.

Select NUCLEO-L476RG board.png

In case you haven't downloaded the STM32L476 Cube library, it will be downloaded automatically. It may take some time.

  • Save the project.

File:GPIO5.png

  • You will then get a popup asking if you want to initialize peripherals to their default configuration
  • No need to configure any peripheral as only the core/Flash/SRAMs are used (default peripherals)
Info white.png Information
Existing examples for some products like STM32G0 can be found at the following path: c:\Users\YourUserName\STM32Cube\Repository\STM32Cube_FW_G0_V1.3.0\Projects\NUCLEO-G071RB\Examples\GPIO\GPIO_IOToggle\GPIO_IOToggle.ioc

You can open the GPIO_IOToggle.ioc file with STM32CubeIDE

Warning white.png Warning
There are no ready-to-use examples for STM32L476.

2.3. Configure GPIO

  • If you want to start the project with a board, the LED pin is already selected (PA5 on NucleoL476RG. For other boards refer to the user manual)

LedPinGPIO.png LED UM GPIO.png

  • Yellow pins are related to the power supply
  • Unused pins are marked as Grey
  • Select the push-pull mode
  • No pull-up and pull-down
  • Output speed set to very high is important for faster peripherals such as SPI or USART.

File:GPIO6.png

2.4. Generate project and edit main.c

The easiest way to generate the code is to save your current project : Ctrl + S
The code is generated so you can see it in the left side of the screen in the project explorer
File:GPIO10.png
Now, open the main.c file which is the main source file for this application

  • The LED toggling is done with a HAL function inside main.c
 /* USER CODE BEGIN 3 */
  /* Infinite loop */
  {
    HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
    HAL_Delay(500);
  }
  /* USER CODE END 3 */
Info white.png Information
Make sure to keep User Code when re-generating !

File:GPIO12.png

2.5. Compile and flash

  • Click on Build button Built.png
  • Click on Debug button (to run step by step) Debug.png
  • Or on Run button (to execute) Run.png

Every 500 ms the green LED state changes.
ST10543 NUCLEO L476RG top D2Blink.png

Warning white.png Warning
All GPIOs are able to drive 5 V and 3.3 V in input mode, but they are only able to generate 3.3V in output push-pull mode