프로그래밍/임베디드

STM32CubeMX프로젝트를 VSCode에서 실행하기

오답노트의 주인 2025. 6. 19. 23:30

환경

대상 버전
OS Windows 10 24H2(Desktop), MacOS Sequoia 15.5(24F74)(MacBook M2 Air)
STM32CubeIDE 1.18.1
STM32CubeMX 6.14.1
STM32CubeProg 2.19.0
STM32CubeCLT 1.18.0
보드 Nucleo-F103RB
펌웨어 V24J46M32

VSCode를 선택한 이유

내 맥북에서 CubeIDE를 키려면 굉장히 긴 시간을 기다려야 한다. 또한 아직까지는 공부를 하고 있어서 깊은 디버깅을 요구하지 않는다. 그래서 VSCode로 빌드+플래쉬까지 가능하다면 환경에 의해 소모되는 시간을 많이 줄일 수 있겠다 싶어 개발환경을 구축하려고 했다.

STM32 VSCode Extension 설치

STM32Cube for Visual Studio Code

VSCode 확장 프로그램을 다운받고 확장 프로그램을 실행하기 위한 아래 3개의 필수 프로그램을 설치한다.

ST-LINK-SERVER나 stlink도 설치해봤지만 위 3개만 있어도 충분하다.

brew install stlink로 패키지를 설치한다면 st-info --probe 명령어를 통해 맥북에서 인식할 수 있는지 확인이 가능하다.

프로젝트 생성/import

먼저 CubeMX로 프로젝트를 만들되 Toolchain/IDE를 CMake로 선택 후 Generate Code를 눌러 코드를 생성했다. 이 프로젝트를 VSCode로 불러온 후 빌드+플래쉬가 정상적으로 된다면 개발환경 구축 성공이다.

VSCode 확장 프로그램이 올바르게 설치되었다면 왼쪽에 STM32로고가 보인다.

로고 모양을 누르고 Import CMake project를 누른 다음 CubeMX에서 생성한 프로젝트의 최상위 경로를 선택한다.

CubeMX로 프로젝트를 생성한 다음 VSCode에서 import하는 방향으로 진행했었기 때문에 다른 기능들에 대해선 나중에 알아보려한다.

곧바로 import되지는 않고, 마지막 설정을 선택하라는데, 보드가 연결되어 있으면 알아서 잘 찾아 설정된다. 제일 아래에 있는 Import project를 눌러서 프로젝트를 불러온다.

import 되면 곧바로 사전 설정 선택 창이 뜬다. 만약 다른 곳을 눌러서 저 창이 사라졌다면 하단에 톱니바퀴 버튼을 눌러 다시 띄울 수 있다.

중간에 프로젝트가 잘못되어서 다시 만드느라 프로젝트 이름이 달라졌습니다;;

사전 설정을 고르면 확장프로그램이 알아서 프로젝트 세팅을 마친다.

빌드+플래시

그 다음, Cmd+Shift+P를 누르면 여러 실행가능한 명령이 뜨는데 그 중에 Tasks:Run Task를 선택하면 .vscode/tasks.json에 설정된 여러 작업 목록을 고를 수 있다.

이번엔 Build + Flash를 선택해 프로젝트를 빌드하고 보드에 플래시(업로드?)하는 작업을 통해 개발환경이 잘 구축되었는지 확인한다.

창이 하나 더 뜨는데 에러를 보여줄지 말지 결정하는 것 같다. 제일 위에 있는 Continue~를 선택한다.

그러면 확장프로그램이 곧바로 Task를 수행하는데 사진처럼 에러를 일으킨다.

연결 실패

  • 원인 : 잘못된 tasks.json 설정
  • 해결 방법 : 명령어 인자 수정
{
  "type": "shell",
  "label": "CubeProg: Flash project (SWD)",
  "command": "STM32_Programmer_CLI",
  "args": [
    "--connect",
    "port=swd",
    "reset=HWrst", /* <---- 이 부분을 추가 */
    "--download",
    "${command:cmake.launchTargetPath}",
    // Let CMake extension decide executable: "${command:cmake.launchTargetPath}",
    "-hardRst", // Hardware reset - if rst pin is connected
    "-rst", // Software reset (backup)
    "--start" // Start execution
  ],
  "options": {
    "cwd": "${workspaceFolder}"
  },
  "problemMatcher": []
}

사진을 잘 보면, STM32CubeProgrammer가 실행되었는데 STM32 타겟을 찾지 못했음을 알 수 있다. 보통 STM32CubeProgrammer는 아래 사진처럼 GUI로 쓰는 경우가 많다.

Error: Unable to get core ID
Error: No STM32 target found! If your product embeds Debug Authentication, please perform a discovery using Debug Authentication

그런데 빌드+플래시를 하는 과정 중에 STM32CubeProgrammer가 CLI환경에서 실행되었지만, 무슨 이유에서인지 연결이 잘 안되었다는 것으로 이해할 수 있다.

실제로 Task에서 수행된 명령어는 다음과 같다.

STM32_Programmer_CLI --connect port=swd --download /Users/kimtaekcheon/Documents/STM32CubeMX/gpio_test2/build/Debug/gpio_test2.elf -hardRst -rst --start

열심히 고생해서 찾은 결과 'arm - How to fix STM32CubeProgrammer No STM32 Target Found - Stack Overflow'에서 원인을 알 수 있었다.

인자값으로 reset=HWrst을 넣어주었을 때 정상적으로 연결이 되었다고 한다.

이에 대한 공식 문서를 찾아보니, um2237-stm32cubeprogrammer-software-description-stmicroelectronics.pdf의 111번 페이지를 보면 연결 시 옵션을 선택할 수 있고 그중에 reset과 관련된 옵션이 있다고 한다. 아까 보았던 reset=HWrst이 있다!

.vscode/tasks.json을 보면 실제로 그 부분이 빠진채로 세팅되어 있는 모습을 볼 수 있었다.

따라서 위의 해결 방법처럼 인자를 추가하고 다시 빌드+플래시를 실행하면 정상적으로 동작한다.

MacOS USB 액세서리 연결

윈도우 환경에서는 드라이버 설치를 했다면 그냥 usb를 꽂기만 해도 정상적으로 연결이 잘 되고 탐색기에서도 확인이 가능했다. 하지만 내 mac환경에서는 전원만 연결되고 이미 업로드된 프로그램이 동작할 뿐, Finder에서 확인할 수 없었고 STM32CubeProgrammer에서는 일련번호만 확인할 수 있었을 뿐 연결이 되지 않았다.

원인을 자세히 알지는 못하지만 해결방법은 이렇다.

액세서리 연결(USB 연결)을 항상 허용으로 해놓는다면 제대로 인식을 못하는 버그가 있다. 개인적인 생각으로는 보드를 꽂는 순간에 보드와 macos간 커뮤니케이션이 되어야 정상적으로 연결이 되는데, 보드의 처리속도가 느려서(?) 커뮤니케이션이 정상적으로 이루어지지 않은 것 같다.

따라서 위 사진처럼 항상 묻기로 설정한 다음, 보드를 macos에 연결하고나서 LD3에 빨간 불이 들어온 다음에 아래 팝업의 허용 버튼을 누르면 정상적으로 연결된다.

제 보드는 LD3이 전원 공급을 의미합니다. 보드마다 다를 수 있습니다.

Finder에서 인식된 모습.

stlink 패키지를 통해 확인한 모습.