개요
STM32 계열 MCU를 사용하면 STM32CubeMX를 사용하여 프로젝트를 만들고 자동으로 코드를 생성한 뒤 STM32CubeIDE 등 STM32를 지원하는 IDE를 사용하여 개발을 진행하는 것이 일반적입니다. 하지만 평소 프로그래밍에 다른 IDE를 사용하고 있는 사람들에겐 별도 IDE에 적응해야 한다는 점은 다소 불편합니다.
PlatformIO는 다양한 MCU를 단일 개발 환경에서 지원합니다. PlatformIO의 가장 큰 장점은 MCU 개발 환경을 기존 IDE에 플러그인 형식으로 통합해준다는 것입니다. 즉, 단순히 소스 편집만이 아니라 툴체인을 통한 빌드와 디버깅까지 한번에 별도 IDE 없이 진행할 수 있습니다. 이 글에서는 STM32CubeMX를 사용해 만든 STM32 프로젝트와 자동 생성 코드를 PlatformIO에 통합하는 법을 소개합니다.
PlatformIO 설치
PlatformIO가 메인으로 지원하는 VS Code에서는 확장에서 PlatformIO를 검색하여 설치할 수 있습니다. 기타 IDE는 홈페이지에서 지원 목록을 확인하시기 바랍니다.
프로젝트 생성
PlatformIO가 요구하는 프로젝트 폴더 구조가 있기 때문에 STM32CubeMX에서 적절히 설정해주어야 합니다. 먼저 Project Manager - Project에서 다음과 같이 선택합니다.
- Application Structure: Basic버그 때문에 선택이 안 될 때가 있습니다. 이 경우 저장 후 ioc 파일을 텍스트 편집기로 직접 열어서
ProjectManager.MainLocation
을Src
로 바꿔보시길 바랍니다. - Toolchain / IDE: STM32CubeIDE
그리고 Project Manager - Code Generator에서 다음 두 항목을 선택합니다.
- Copy only the necessary library files
- Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral
이제 GENERATE CODE 버튼을 눌러 코드를 생성합시다. 생성 후 프로젝트 폴더 구조는 다음과 같을 겁니다.
<프로젝트 폴더>
├── Drivers/
├── Inc/
├── Src/
├── Startup/
├── <MCU 이름>_FLASH.ld
├── <MCU 이름>_RAM.ld
└── <프로젝트 이름>.ioc
PlatformIO 설정
PlatformIO 설정은 프로젝트 폴더 내 platformio.ini
파일에 작성합니다. 다음 예제를 보시죠.
[platformio]
include_dir = Inc
src_dir = .
[env:genericSTM32F405RG]
platform = ststm32
board = genericSTM32F405RG
build_flags =
-DUSE_HAL_DRIVER
-DSTM32F405xx
-IDrivers/CMSIS/Device/ST/STM32F4xx/Include
-IDrivers/CMSIS/Include
-IDrivers/STM32F4xx_HAL_Driver/Inc
-IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy
board_src_filter = -<*> +<Src/> +<Startup/startup_stm32f405rgtx.s> +<Drivers/>
board_build.ldscript = ./STM32F405RGTX_FLASH.ld
upload_protocol = stlink
debug_tool = stlink
[platformio]
섹션은 폴더 구조를 설정하는 부분이고, [env]
섹션은 빌드 및 디버그 환경을 설정하는 부분입니다. 위 예제에서 genericSTM32F405RG
는 PlatformIO에서 인식하는 보드 이름으로, STM32에 대해서는 이곳에서 목록을 확인하실 수 있습니다. PlatformIO에서 기본적으로 지원하지 않는 MCU의 경우 이곳을 참조하여 직접 보드 정보를 추가할 수 있습니다.
PlatformIO는 헤더 파일과 소스 파일 경로 설정이 상당히 달라서 복잡합니다. 헤더 파일 경로는 include_dir
에서 하나를 정해주고 나머지는 컴파일 옵션을 정의하는 build_flags
에 -I
플래그로 추가해주면 됩니다. 반면에 소스 파일 경로는 일단 src_dir
에 하나를 추가하고, 그 속에서 필터링으로 원하는 파일만 선택하는 방식입니다. 따라서 위 예제에서는 프로젝트 폴더 전체를 src_dir
로 지정한 다음 board_src_filter
에서 모든 파일을 일단 제외했다가 Src
, Startup
, Driver
폴더 내의 소스 파일들을 다시 추가했습니다.
build_flags
는 STM32CubeIDE에서 볼 수 있는 프로젝트 설정을 참조하면 좋습니다.
마지막으로 board_build.ldscript
는 링커 스크립트를 지정하고, upload_protocol
과 debug_tool
은 업로드 및 디버깅에 사용할 프로토콜과 도구입니다.
PlatformIO 홈 메뉴에서 STM32 프로젝트를 만들었을 때 생성되는 설정 파일에는 framework
가 stm32cube
로 설정되어 있는데, 이걸 삭제하지 않으면 STM32CubeMX가 자동 생성한 드라이버 코드와 충돌이 일어나는 문제가 있습니다.
자세한 설정 파일 양식은 문서를 참조하시기 바랍니다.
빌드, 업로드, 디버그
platformio.ini
를 작성한 다음 VS Code 창을 다시 로드하면 PlatformIO가 설정에 따라 빌드 환경을 구축합니다. 이제 왼쪽 패널에서 PlatformIO를 찾아 빌드, 업로드, 디버그를 해보면 완벽하게 수행되는 걸 볼 수 있습니다. 더군다나 CubeMX가 생성한 코드를 그대로 사용하기 때문에 언제든지 코드나 설정, 폴더 구조 수정 없이 STM32용 IDE로 옮겨가 PlatformIO로 하기 힘든 일을 하고 돌아올 수도 있습니다.