STM32 개발환경 with VisualStudio Code & STM32CubeProg

ST는 통합 개발환경 STM32CubeIDE를 제공하며, 이것을 사용하여 MCU 코딩 및 디버깅 환경을 제공하지만, 우분투 환경에서는 많은 리소스를 소비하여 시스템이 느려지는 현상이 발생하고, 결정적으로 이클립스가 손에 익숙치 않아 코딩하는데 매우 불편하여 STM32CubeMX + VisualStudio Code로 개발환경을 구성한 블로그를 참고하였다.

 

Using Visual Studio Code with STM32CubeMX for ARM Development

Every day, the software world is moving away from traditional software and hardware tools by replacing them with better and faster open source alternatives. Today, the most compelling open source alternatives for ARM embedded development are based on Eclip

hbfsrobotics.com

그런데, STM32CubeMX로 코드 생성한 것과 STM32CubeIDE에서 생성한 코드가 다소 차이가 있고, STM32CubeMX도 TrueStudio와 같이 추후 지원이 종료될 것으로 판단되어 STM32CubeIDE를 갖고 VisualStudio Code로 개발 및 디버깅 방법을 찾아 정리하였다.

 

STM32CubeIDE는 STM32CubeMX와 달리 makefile 형식으로 코드 생성이 불가하기 때문에 최소 한번은 STM32CubeIDE로 Build를 실행해야 makefile이 생성된다. 즉 makefile을 직접 작성한다면 Build 과정없이 바로 makefile을 직접 구성하면 되지만, 그렇지 않다면 파일이나 디렉토리를 추가할 경우 STM32CubeIDE로 최소 한번 Build를 해야 한다.

 

STM32CubeIDE를 설치하면 Toolchain과 STLink-GDBServer가 플러그인으로 함께 설치되며, CLI 환경에서 build 및 gdb-server를 사용하기 위해 아래 이미지와 같이 링크를 설정 및 사용자 계정의 PATH를 추가하였다.

$ cd /opt/st
$ sudo ln -s stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_1.5.0.202011040924/tools STM32GDBServer
$ sudo ln -s stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.7-2018-q2-update.linux64_1.5.0.202011040924/tools STM32Toolchain
$ vi ~/.bashrc

...
export PATH=/opt/st/STM32Toolchain/bin:/opt/st/STM32GDBServer/bin:/opt/st/STM32CubeProgrammer/bin:$PATH
export LD_LIBRARY_PATH=/opt/st/STM32GDBServer/bin/native/linux_x64:$LD_LIBRARY_PATH

STLink-GDBServer 실행하는데 공유라이브러리를 참조하기 때무넹 LD_LIBRARY_PATH도 함께 설정하도록 한다. 그리고 STLink-GDBServer를 실행하려면 포트 설정과 같은 몇가지 옵션이 필요하며, 이것을 config.txt 파일에 정리하여 사용하지만 아래와 같이 st-gdbserver 스크립트 파일을 생성하여 사용하는 것이 편하다.

$ sudo vi /opt/st/STM32GDBServer/bin/st-gdbserver

#!/bin/sh
ST-LINK_gdbserver -p 61234 -r 15 -e -d -cp /opt/st/STM32CubeProgrammer/bin

지금까지의 과정은 CLI 환경에서 빌드 및 디버깅에 필요한 선행 작업을 정리한 것이다. 이제부터 STM32CubeIDE에서 생성된 코드 및 makefile을 가지고 VisualStudio Code로 개발 및 빌드 그리고 디버깅 방법은 다음과 같다.

uart.c / uart.h 파일만 추가하고 코드는 작성하지 않은 상태로 Build만 실행하여 STM32CubeIDE에서 makefile을 생성하도록 하였다. 이렇게 생성된 소스 및 makefile 파일을 바탕으로 VisualStudio Code에서 소스를 작성 및 디버깅을 할 것이다. 우선 BoardTest 디렉토리를 VisualStudio Code 프로젝트로 생성하도록 한다.

VisualStudio Code로 C/C++ 개발 효율성을 높이기 위해 MS에서 만든 C/C++ Extension을 설치하고 STM32CubeIDE에서 생성한 프로젝트를 포함시키면 위 이미지와 같이 헤더 및 Preprocessor에 따른 수많은 참조 에러가 발생한다. 이것을 제거하기 위해서는 C/C++ Property를 설정해야 하며, 이것은 아래 이미지처럼 STM32CubeIDE의 프로젝트 Properties를 참조하여 생성할 수 있다.

위 내용을 VisualStudio Code에 적용하려면 MS C/C++ Extension이 설치되어 있어야 하며, Ctrl + Shift + P 명령어를 사용하여 C/C++ 프로퍼티를 아래 이미지와 같이 설정이 가능하다.

위와 같이 VisualStudio Code를 설정하면 소스코드에서 발생하는 에러나 워닝은 사라지며, VisualStudio Code에서 아래 이미지와 같이 간단하게 소스코드를 작성할 수 있다.

VisualStudio Code로 코딩하는 이유는 가독성이 좋고, 개발도구 자체가 매우 가볍기 때문에 STM32CubeIDE를 사용할 때 느꼈던 답답함을 날려버릴 수 있다. 그리고 위에서 설명한 STM32CubeIDE에서 설치한 Toolchain을 이용하여 빌드할 수 있으며 STM32CubeProgrammer를 이용하여 CLI 환경으로 플래시 다운로드를 할 수 있다.

그리고 STLink-GDBServer를 이용하여 아래 이미지와 같이 소스 레벨로 디버깅이 가능하다.

마지막으로 STM32CubeIDE에서 생성한 makefile 파일을 약간 수정을 해야 한다. 이 파일은 STM32CubeIDE로 빌드할 때마다 새로 생성되기 때문에 파일이나 디렉토리를 추가한 경우가 아니라면 STM32CubeIDE로 빌드를 하지 말아야 하며, makefile 파일의 clean 커맨드가 Debug 디렉토리의 모든 파일을 지우는 방법으로 되어 있기 때문에 아래와 같이 변경하도록 한다.

clean:
	# -$(RM) *
	-@find -name *.o | xargs rm -f
	-@find -name *.d | xargs rm -f
	-@find -name *.su | xargs rm -f
	-@rm -f $(BUILD_ARTIFACT_NAME).*
	-@echo ' '

프로젝트를 생성할 때 번거로운 작업을 좀 해야하지만, STM32CubeIDE보다 가볍고 빠른 개발환경을 구성할 수 있다면 이정도 번거로움은 감수할 수 있을 것이다.