STM32 LED Blink Code Example

In this tutorial, we’ll create an STM32 LED Blink Example Code Project with the STM32 blue pill board. You’ll learn all the steps required to configure the STM32 microcontroller in CubeMX & flash the code from STM32CubeIDE to the blue pill board. Without further ado, let’s get right into it!

Table of Contents

  1. STM32 LED Blink Overview
  2. STM32 LED Blink Example
  3. STM32 LED Blink Example Testing
  4. Wrap Up

To create an STM32 LED Blink project, we need to configure a GPIO pin as an output pin and toggle its state at fixed time intervals.

For the GPIO pin state change, we can use one of the following functions:

  • HAL_GPIO_Write() Sets an output pin to HIGH or LOW
  • HAL_GPIO_TogglePin() Toggles the state of a GPIO pin

For the delay between each pin state change, we can use the following options:

The HAL_Delay() function is the easiest to use for such a project especially if it’s your first STM32 project. However, other time delay techniques are illustrated in more detail in the links above.


Objectives of This STM32 LED Blink Example Project:

  • Configure GPIO Output Pin Within the STM32CubeMX Tool
  • Use HAL_GPIO_Write() function to change an output pin state
  • Use HAL_GPIO_TogglePin() function to toggle the state of a GPIO pin
  • Use The HAL_Delay() & Know How It Works

Step #1

Open STM32CubeMX, create a new project, and select the STM32F103C8T6 target microcontroller. Note that the STM32 BluePill board has two common target microcontrollers (STM32F103C8T6 & STM32F103C6T6). So you need to select the exact target microcontroller on your hardware board.

This example project should work flawlessly on any STM32 target microcontroller, you just need to select the target MCU that matches your hardware board.

Step #2

Go to the RCC clock configuration page and enable the HSE external crystal oscillator input.

Click on the PA8 GPIO pin in the “Pinout View” and select it to be in GPIO_Output mode. Note: you can use any other pin you want instead.

STM32 RCC External Clock Selection CubeMX

Step #3

Go to the clock configurations page, and select the HSE as a clock source, PLL output, and type in 72MHz for the desired output system frequency. Hit the “ Enter” key, and let the application solve for the required PLL dividers/multipliers to achieve the desired clock rate.

The reason behind this: using the external onboard oscillator on the BluePill board provides a more accurate and stable clock, and using a 72MHz as a system clock pushes the microcontroller to its limits, so we get the maximum performance out of it. As long as we don’t care about the application’s power consumption.

STM32-Blue-Pill-Proteus-Library-Simulation-Clock-Configuration

Step #4

Finally, go to the Project Manager, give your project a name, select the toolchain/IDE to be STM32CubeIDE, and click on the Generate Code button.

The STM32CubeMX tool will generate the initialization code & the project main files and it’ll prompt you to open the project in STM32CubeIDE. Select, open project, and let’s move to the next step.

Generate Initialization Code From STM32 CubeMX

Then, open the project in the IDE you’re using. And head over to the main.c file. So we can start writing the application code and have a look at the initialization code generated by the STM32 CubeMX tool.

Step #5

Copy the following code into your main.c file replacing the auto-generated code from the beginning of the fill till the main function. You should leave everything else under the main() function in the main.c file as is.

This code example uses the STM32 HAL_GPIO_TogglePin() function.

This code example uses the STM32 HAL_GPIO_TogglePin() function.

You can use any of the previous code examples. Both are doing the exact same functionality (blinking an LED every 100ms).


Step #1

Refer To The Blue Pill Board Schematic & Pinout

Blue pill pinout

Step #2

Connect The ST-Link To The USB Port & SWD Pins On Board

STM32 GPIO HAL Led Blinking

Step #3

Click The Debug Button To Compile The Code & Flash It To The Board & Start A Debugging Session

STM32 HAL GPIO LED Blinking

Step #4

You Can Stop The Debugging Session or Restart The MCU Once To Run The New Application At The Booting Process.


Required Parts For STM32 Examples

All the example Code/LABs/Projects in this STM32 Series of Tutorials are done using the Dev boards & Electronic Parts Below:

QTY.Component NameAmazon.comAliExpresseBay
1STM32-F103 BluePill Board (ARM Cortex-M3 @ 72MHz)AmazonAliExpresseBay
1Nucleo-L432KC (ARM Cortex-M4 @ 80MHz)AmazonAliExpresseBay
1ST-Link V2 DebuggerAmazonAliExpresseBay
2BreadBoardAmazonAliExpresseBay
1LEDs KitAmazonAmazonAliExpresseBay
1Resistors KitAmazonAmazonAliExpresseBay
1Capacitors KitAmazonAmazonAliExpress & AliExpresseBay & eBay
1Jumper Wires PackAmazonAmazonAliExpress & AliExpresseBay & eBay
1Push ButtonsAmazonAmazonAliExpresseBay
1PotentiometersAmazonAliExpresseBay
1Micro USB CableAmazonAliExpresseBay

★ Check The Links Below For The Full Course Kit List & LAB Test Equipment Required For Debugging ★

Download Attachments

You can download all attachment files for this Article/Tutorial (project files, schematics, code, etc..) using the link below. Please consider supporting our work through the various support options listed in the link down below. Every small donation helps to keep this website up and running and ultimately supports the whole community.


Wrap Up

In conclusion, it was quite easy to create our first STM32 LED blinking project using the HAL GPIO WritePin or TogglePin functions. You can play with different settings like delay period, multiple IO pins, and so on.

If you’re just getting started with STM32, you need to check out this STM32 Series of Tutorials to learn more about STM32 Microcontrollers Programming.

Share This Page With Your Network!
Join Our +25,000 Newsletter Subscribers!

Stay Updated With All New Content Releases. You Also Get Occasional FREE Coupon Codes For Courses & Other Stuff!

Photo of author
Author
Khaled Magdy
Embedded systems engineer with several years of experience in embedded software and hardware design. I work as an embedded SW engineer in the Automotive & e-Mobility industry. However, I still do Hardware design and SW development for DSP, Control Systems, Robotics, AI/ML, and other fields I'm passionate about.
I love reading, writing, creating projects, and teaching. A reader by day and a writer by night, it's my lifestyle. I believe that the combination of brilliant minds, bold ideas, and a complete disregard for what is possible, can and will change the world! I will be there when it happens, will you?

Leave a Comment