ROSMASTER

[ROSMASTER] STM32 - LED Blink

changyun 2022. 9. 11. 00:06

 

본 포스팅에서는 Expansion board에 내장되어있는 LED를 점등시킵니다. 이를 통해 STM32CubeIDE 와 기본적인 코딩 프로세스를 알아보려고 합니다.

 

STM32CubeIDE 프로젝트 생성

STM32CubeIDE를 실행하고 Workspace 위치를 지정한 후 새 프로젝트를 생성합니다. 

File $\rightarrow$ New $\rightarrow$ STM32 Project 를 선택합니다. 

 

STM32 프로젝트 생성

 

우리가 사용하는 마이크로컨트롤러(이하 MCU)를 선택해야 합니다. Expansion board는 MCU로 STM32F103RCT6 을 사용하므로, Commercial Part Number 에 해당 모델을 입력해줍니다.  

 

마이크로컨트롤러 선택

 

프로젝트명을 지정해줍니다. 저는 LED_BLINK 라는 이름으로 지정했습니다. STM32CubeIDE는 이클립스처럼 파일에 따라 Perspective 를 바꿀 수 있습니다. Remember my decision 을 체크한 후 Yes 를 누릅니다. 

 

 

프로젝트가 생성되고 LED_BLINK.ioc 라는 파일이 열립니다.

 

 

 

ioc 설정으로 초기 코드 생성하기

MCU의 설정들을 변경하기 위해서는 데이터시트를 살펴보며 핀맵을 하나하나 설정해줘야 합니다. 이 과정은 어렵고 오래 걸리는 일이기때문에, STM32CubeIDE에서는 .ioc 파일에서 GUI를 통해 설정할 수 있게 해두었습니다.

 

클럭 설정

먼저 기본적인 클럭을 설정합니다.

Pinout & Configuration $\rightarrow$ RCC $\rightarrow$ High Speed Clock (HSE) 를 Crystal/Ceramic Resonator 로 변경합니다. HSE는 High-speed External Clock 을 의미하며, LSE는 Low-speed External Clock을 의미합니다. HSE는 4~16 MHz, LSE는 최대 32.768 kHz 이므로 높은 클럭을 사용하고 싶을 때는 HSE를 사용하면 됩니다.

 

 

어떤 클럭을 사용할 지 설정했으므로, 클럭의 Hz를 설정해야 합니다. Clock Configuration 에서 HCLK (MHz) 부분을 최대 값인 72로 설정한 후 OK를 누릅니다. 

 

 

LED GPIO 설정 

본 포스팅의 목적은 Expansion board 에 내장되어 있는 LED를 깜빡이는 것입니다. 따라서, LED가 연결되어 있는 핀의 설정을 변경해줘야 합니다. Expansion board의 Schematic을 보면 Status Indicator 에 LED가 PC13에 연결되어 있음을 알 수 있습니다. 

 

 

.ioc 파일의 Pinout & Configuration 에서 PC13 을 눌러 GPIO_Output 으로 설정해준 후, User Label을 설정해줍니다. 뒤에서 살펴보겠지만, User Label 은 사용자가 편의상 붙이는 이름으로 해당 Label 에 맞게 매크로가 정의됩니다. 

 

 

LED 까지 설정을 마쳤으면 Ctrl + S 를 누릅니다. MacOS의 경우는 Ctrl + S 단축키가 할당되어 있지 않으므로 노란색 톱니 모양의 아이콘을 눌러서 코드를 생성합니다. 

 

 

아래와 같은 디렉토리를 가진 프로젝트가 생성됩니다. Core 폴더의 Inc는 헤더파일이, Src는 소스 파일이 포함되어 있습니다. 

 

 

초기 코드

main.h 부터 확인해보겠습니다.

 

STM32F103R 로 시작하는 MCU는 51개의 GPIO 핀을 가지고 있습니다. 이 핀들은 GPIOA 부터 GPIOG까지 알파벳으로 나뉘며, 숫자는 최대 16번까지 카운팅됩니다. 예를들어, 우리가 사용한 핀은 GPIOC의 13번 핀입니다. 

 

앞에서 PC13 핀의 User Label 을 LED 로 설정했기 때문에 GPIOC 가 LED_GPIO_Port 로, GPIO13 핀이 LED_Pin 으로 정의된 것을 볼 수 있습니다.

 

 

main.c 를 보면 GPIO 에 대한 init 코드가 들어있음을 알 수 있습니다.  

 

 

LED Blink 코드 작성

코드를 작성하기 위해서는 각 파일의 User code begin 과 User code end 주석의 사이에 작성해야 합니다. 해당 주석들의 바깥에서 작성하면 ioc 설정을 변경했을 때, 코드가 사라지게 됩니다.

 

main.c 의 main 함수 안에 아래와 같이 작성해주면 while 문에 의해 해당 코드가 반복됩니다.
HAL_GPIO_WritePin() 함수는 특정 Pin의 출력을 결정할 때 사용합니다.

 

LED_GPIO_Port 로 어떤 GPIO를 사용할지 정하고, LED_Pin으로 해당 GPIO의 핀 번호를 정해줍니다. 

SET과 RESET은 각각 1과 0을 의미합니다. 

 

HAL_Delay() 함수로 LED를 켜고 끄는 사이에 시간을 넣어줍니다. 단위는 ms로, 여기서는 0.5초를 넣어줬습니다.

 

참고로, 함수를 입력할 때 Ctrl + space를 누르면 자동완성이 됩니다.  

 

코드 컴파일

작성한 코드를 Expansion board에 올려야 합니다. 보드에 올리기 위한 hex 파일을 생성하겠습니다.

 

상단 메뉴바에서 Project $\rightarrow$ Properties 를 누릅니다. 

 

 

Properties 창이 열리면 Settings $\rightarrow$ MCU Post build outputs $\rightarrow$ Convert to Intel Hex file (-O ihex) 를 선택합니다. 이 설정을 해줘야 코드 빌드 시 hex 파일이 생성됩니다. 

 

 

 

망치모양의 아이콘을 눌러서 코드 빌드를 해줍니다. 작성한 코드에 문제가 없으면 하단의 Console 창에 0 erros, 0 warnings 를 볼 수 있으며, workspace 의 프로젝트 폴더 안의 Debug 폴더에 LED_BLINK.hex 파일이 생성됩니다.   

 

 

 

코드 다운로드

Expansion board에서 hex 파일을 다운로드해야합니다. PC와 Expansion board를 micro pin으로 연결합니다. 

 

 

앞 포스트에서 설치한 Flash Loader Demonstrator 를 실행한 후 Port Name을 지정해줍니다.

 

Expansion board를 Burning mode 로 변경해줘야 Code를 올릴 수 있습니다. 2번으로 표시된 BOOT0 버튼을 누르면서 3번으로 표시된 RESET 버튼을 누르면 Burning mode에 진입합니다. Next를 눌러서 다음 화면으로 넘어갑니다. 

 

 

기본설정 상태에서 Next를 누르면 아래와 같은 화면으로 진입합니다. Donwload to device 를 선택한 후 앞에서 생성한 LED_BLINK.hex 파일을 선택합니다. 오른쪽 하단의 확장자를 hex Files로 변경해줘야 파일이 보입니다. 

 

 

Next를 누르면 Download 게이지가 올라가면서 완료됩니다. 

 

 

파일이 다운로드되면 RESET 버튼을 한번 눌러줍니다. 왼쪽의 빨간색 LED가 깜빡이는 것을 확인할 수 있습니다. 

 

 

Reference 

  1. Yahboom의 ROSMASTER X3