Controlling LED with Push Button using the STM32-F103RB Nucleo Board
Introduction
Problem Statement
Requirements
To successfully complete this project, you will need the following components:
- STM32-F103RB Nucleo Board
- LED
- Resistor (220-330 ohms)
- Push button
- Breadboard
- Jumper wires
Circuit Diagram
Follow the circuit diagram below to connect the Switch and LED to the Nucleo board:
- Connect the positive (anode) pin of the LED to PA5 pin of the STM32-F103RB Nucleo Board.
- Connect the negative (cathode) pin of the LED to a resistor and then to the GND pin of the board.
- Connect one terminal of the push button to PC13 pin of the STM32-F103RB Nucleo Board.
- Finally, connect the other terminal of the push button to the ground (GND) pin of the STM32-F103RB Nucleo Board.

Project Configuration
Follow these steps to configure the .IOC file and set up GPIOs and Clock :
Open the STM32 Cube IDE and start by creating a new STM32 project. Click on the board selector tab in the target selection window.
Enter "NUCLEO-F103RB" as the commercial part number and click on "Next" after selecting the board.

- Enter the Project Name "push_button" and click on "Finish". After that, click on "Yes" to initialize all the peripherals in default mode.

In the Pinout view of the STM32 Cube IDE, locate the PC13 pin. Select the "GPIO_Input" option for PC13 and name it as "button". Locate the PA5 pin and select the "GPIO_Output" option for PA5. Name it as "LD2".
In the Pinout & Configuration menu, navigate to the GPIO section. Select the PC13 pin that is named "button". Set the GPIO Pull-up/Pull-down option to "Pull Up" for the PC13 pin. Leave the rest of the configuration settings as default.

After finishing the Pinout Configuration, go to the Clock Configuration menu. In the HCLK field, enter "72 MHz" as the desired frequency for the HCLK (system clock). The Integrated Development Environment (IDE) will automatically search for the necessary clock sources and prescalers based on this configuration.
Next, locate the gear-like icon on the toolbar and click on it. This will add the configuration settings we did in the GUI to the code.

Code
Now, let's proceed to understand and write the C code to control the LED using Push Button. Follow the steps below:
The Device Configuration Tool will automatically open the main.c file for you. In the project, you will find all the necessary pin and port names defined in the Core ⇾ Inc ⇾ main.h file. These definitions will help us easily reference the pins and ports in our code.
Navigate to the main function in the main.c file and paste the following code:
Note: You can download the full project code from the provided link.
int main(void)
{ /* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
uint8_t btn_val = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
btn_val = HAL_GPIO_ReadPin(button_GPIO_Port, button_Pin); // read the value of the button
if (btn_val==0)
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); // turn on the LED
}
else
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); // turn off the LED
}
}
/* USER CODE END 3 */
}
After pasting the above code, ensure that you have connected your STM32-F103RB Nucleo Board to your PC/Laptop using a USB cable.
Next, click on the "Run and Debug" icon in the toolbar menu of the IDE (Refer to image below ). This will initiate the build process for your project. The IDE will compile the code. Once the build process is successful, the IDE will start flashing the compiled project to the STM32-F103RB Nucleo Board.

Output
Upon successfully running the project, when the button is pressed, the LED will turn on. And when the button is released, the LED will turn off.
Conclusion
In this guide, we learned how to interface a push button and LED with the STM32-F103RB Nucleo Board. By reading the state of the button and controlling the LED using GPIO pin operations, we achieved a simple but effective control mechanism. This project serves as a foundation for more advanced applications involving user input and output control.