[STM32CubeIDE] LED Blink

YUN·2025년 8월 22일

[기본적인 CS]

목록 보기
16/21

1. 프로젝트 생성

조금 기다리면,,,

여기서 보드 찾아준다.

여기서 Nucleo-64MCU핀 개수를 의미한다.

STM32F103RB-Nucleo 보드의 경우 내부에 MCU를 잘 보면 핀이 64개인 것을 확인할 수 있다.

현재 내가 사용중인 STM32F103RB-Nucleo 보드는 STM32F1 계열 MCU를 사용하고있다.

스크롤 조금 더 내려서 MCU/PU Series에서 STM32F1을 골라준다.

선택하면 이렇게 위에 보드에 대한 설명이 나온다.

Next 눌러주자.

프로젝트명은 LED_BLINK로 설정해줬다.

  • location -> 어느 위치에 프로젝트 저장할지 (나는 앞전에 C:/stm32_ws를 기본 경로로 설정해뒀다)
  • Targeted Language -> 어떤 언어로 개발할지
  • Targeted Binary Type -> 바이너리 파일로 만들지, 라이브러리로 만들지
  • Targeted Project Type -> 뭐지?

Finish 눌러주자.

Yes 해주자. Yes하면 STM32F103RB-Nucleo 보드 주변 장치의 기본 설정을 불러온다.

주변 장치의 기본 설정 이란?

STM32 보드(Nucleo-64 같은 개발 보드)는 단순히 MCU만 올려놓은 게 아니라, 특정 핀에 LED, 버튼, ST-LINK, Arduino 헤더 등을 이미 연결해뒀다.

👉 그래서 CubeIDE에서 보드를 선택할 때 자동으로 그 보드에 맞는 기본 하드웨어 연결을 미리 설정해준다.


예를들어,

  • User LED (LD2)

Nucleo 보드에 있는 녹색 LED (보드 위에 붙어 있음)

기본적으로 PA5 핀에 연결됨

CubeIDE에서 Yes 하면 PA5 핀을 GPIO Output으로 자동 설정해줌

  • User Button (B1, BLUE 버튼)

보드 위에 있는 사용자 버튼

기본적으로 PC13 핀에 연결됨

(위와 같은 정보는 STM32F103RBBoard Schematic에서 얻을 수 있다.)

CubeIDE에서 Yes 하면 PC13 핀을 GPIO Input으로 자동 설정한다.



위와 같이 일부 핀들이 기본적으로 설정이 되어있는 것을 확인할 수 있다.

2. Pinout & Configuration 설정

STM32 MCU의 각 핀과 주변장치(Peripheral) 기능을 설정하는 단계

STM32의 핀은 멀티플렉스(Multiplexed) 구조라서, 한 핀에 여러 기능이 들어있음.

따라서 개발자가 어떤 핀을 GPIO로 쓸지, UART로 쓸지, ADC로 쓸지를 지정해야 함.

CubeMX는 이 설정을 GUI로 쉽게 해주고, 선택한 대로 초기화 코드를 자동 생성해 줌

(1) RCC(Reset and Clock Control) 설정

HSELSE를 이번 실습에서 쓰지 않을 예정이므로 위와 같이 HSELSEDisable 해준다.

설정을 변경하면 Pinout view에서 자동으로 변경한것이 반영되는 것을 확인할 수 있다.

(2) GPIO(General Purpose Input/Output) 설정

STM32F103RB-Nucleo 보드의 기본 설정으로 PA5PC13GPIO로 설정되었음을 확인할 수 있다.

이렇게 PA5를 클릭하면 PA5의 세부 상태를 확인할 수 있다.

현재 LED 출력을 위해 GPIO modeOutput으로 설정되었음을 확인할 수 있다.

나중에 Generate Code 단계를 거치면 User Label 이름으로 GPIO_PINGPIO_Port가 생성된다.
(완전 동일하진 않고, 네이밍룰이 적용되어 해당 LD2 가 포함된 이름으로 생성된다)

(스포)

🧐 PA5가 뭐랑 연결된 핀 일까?

위는 STM32F103RB-Nucleo 보드의 Schematic 이다.

보드 뒷편의 SB(솔더 브릿지) 확인해보면 LD2PA5와 연결되어 있음을 확인할 수 있다.

아 ! PA5HIGH 쏴주면 LD2가 켜지는구나 ! 를 알 수 있다.

3. Clock Configuration 설정

클럭의 소스와 분주 비율을 설정하는 단계

STM32 MCU 내부의 CPU, 버스, 주변장치(UART, SPI, ADC 등)가 동작하려면 모두 클럭(시계신호, Oscillator) 신호가 필요하다.

클럭의 소스분주 비율을 설정하는 단계가 바로 Clock Configuration 이다.

https://velog.io/@yun_study/STM32CubeIDE-Clock-Configuration

에 관련 설명이 있다.

앞서 RCC 단계에서 HSELSE를 비활성화 했으므로 Clock Configuration에서도 비활성화 되어있는 것을 확인할 수 있다.

위와같이 MUX에서 PLLCLK를 선택해서 HCLK64MHz가 되도록 설정하자.

현재는 HSI(내부 고속 클럭)를 소스로, PLL로 주파수를 곱하고, 이를 MUX에서 선택해 HCLK64MHz로 만든 것이다.

(STM32F103RB-Nucleo 보드 최대 HCLK72MHz 이지만, 내부 클럭으로는 64MHz가 최대이다.)

4. Generate Code

앞서 수행한 설정을 기반으로 코드를 자동 생성하는 단계

  • Pinout & Configuration (핀 기능 설정=주변 장치 설정)

  • Clock Configuration (클럭 설정)

  • Middleware 선택 (FreeRTOS, FATFS 등)

이런 걸 CubeMX를 통해 GUI로 다 설정한 뒤, 코드 자동 생성을 하는 단계가 바로 Generate Code임.

즉, 내가 GUI에서 고른 설정을 반영해서 C 초기화 코드(HAL 기반 코드)와 프로젝트 구조를 자동으로 만들도록 하는 단계이다.

Project-Generate Code 를 눌러준다.

위와 같이 자동으로 여러 파일들이 생긴 것을 확인할 수 있다.

5. 프로젝트 빌드

Project-Build Project로 프로젝트를 빌드해보자.

Console을 보면 성공적으로 빌드된 것을 확인할 수 있다.

6. 소스 코드 작성

C언어로 소스코드를 작성하는 단계

앞서 CubeMX로 설정한 주변 장치, 클럭 설정등의 정보를 바탕으로 Generate Code 단계에서 이미 주변 장치, 클럭 설정관련 코드는 자동으로 생성되었다.

이제는 C언어로 소스코드를 작성할 차례이다.


CubeIDE 프로젝트 생성하면 Drivers/STM32F1xx_HAL_Driver/ 같은 폴더가 생기는데,
여기 안에 HAL 함수들이 전부 들어있다.


예를들어,

  • stm32f1xx_hal_gpio.c → GPIO 제어 HAL 구현체

  • stm32f1xx_hal_uart.c → UART 제어 HAL 구현체

  • stm32f1xx_hal_rcc.c → RCC 클럭 제어 HAL 구현체

이런식으로 말이다.

HAL Driver에서 제공되는 함수를 이용할 것이다.

위는 HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) 함수이다.

GPIO 핀의 출력을 Toggle하는 함수이다.

위는 HAL_Delay(uint32_t Delay) 함수이다.

ms단위로 딜레이를 주는 함수이다.

우리는 GPIO 5번의 출력을 Toggle 해야한다.



main.h에 들어가서 GPIO 5 번이 어떤 이름의 변수로 Generate 되었는지 확인해야한다.

GPIO 5번은 LD2_Pin으로, GPIOALD2_GPIO_Port 이름으로 Generate된 것을 확인할 수 있다.

.c 파일에서 이 이름으로 코드를 짜면 된다

main.c로 가서 while 문의 BEGIN-END 내부에 위와같이 C 코드를 적어준다.

(코딩하는 규칙 관련 학습 기록이다., https://velog.io/@yun_study/STM32CubeIDE-%EA%B8%B0%EB%8A%A5)

7. 프로젝트 빌드

GOOD

8. 보드에 업로드(플래시)

지금 주변이 복잡하긴한데,,,,어쨋든 STM32F103RB-Nucleo 보드와 PCUSB로 연결해준다.

장치관리자에 들어가보면 STM32F103RB-Nucleo 보드가 가상 COM 포트로 잡힌 것을 확인할 수 있다.

Run-Run

OK 눌러준다

성공 !

STM32 MCU 내부의 Flash memory에 코드가 정상적으로 올라간 듯 하다.

9. 디버깅

시스템의 오류나 결함을 검출하여 제거하는 과정

문법 관련 오류는 빌드 과정에서 컴파일러가 잡아주지만, 코드상의 논리적인 오류 는 디버깅을 통해 찾아내야한다.

Debug 모드에서는 코드를 한 줄씩 실행해볼 수 있고, Breakpoint를 지정해 지정된 포인트에서만 정지해서 코드를 살펴볼 수도있다.

위 처럼 디버깅 화면으로 진입한다.

앞전에 Run-Run 했을떄와 마찬가지로 변경 내용 저장빌드, 코드 업로드까지 진행된후에 디버깅 화면으로 전환된다.

위와 같이 다양한 디버깅 관련 기능들이 존재한다.

(1) Break point 설정해보기

위처럼 Line number-우클릭-Toggle Breakpoint or Add Breakpoint를 통해 Breakpoint 설정이 가능하다.

위와 같이 resume 버튼을 누르면 100Breakpoint 설정했으므로 100번째 줄 너머의 코드 수행 직전까지만 코드를 실행한다.

종료버튼 누르면 디버그 모드를 종료할 수 있다.

참고로 해당 버튼 누르면 코드를 처음부터 다시 실행한다.

끝!

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글