20251201 # STM32 專案 VSCode 開發流程 ## 環境設置 安裝 [VSCode](https://code.visualstudio.com/) 並開啟 安裝中文套件 ![image](https://hackmd.io/_uploads/SkHu455Zbe.png) 安裝 STM32 VSCode 套件 ![image](https://hackmd.io/_uploads/BJXV5ic--e.png) 左側選單選擇 STM32CUBE 點擊啟動 STM32CubeMX 與 STMCUFinder VSCode 找不到這兩個軟體時會跳出框 可直接點擊下載跳轉至官方下載頁面 ![image](https://hackmd.io/_uploads/rkpYco5b-l.png) 下方點擊 System 的 Bundle 管理 ![image](https://hackmd.io/_uploads/Bk9Ps29bZe.png) 全選並進行安裝更新 ![image](https://hackmd.io/_uploads/Sy3153qZZx.png) 再次點擊啟動 STM32CubeMX 建立新專案 ![image](https://hackmd.io/_uploads/BJXFhjcbZe.png) 選擇使用的 STM32 晶片或版子 設定腳位功能、時鐘等 並在專案管理設定專案名稱、專案目錄 工具鏈與 IDE 設定為 CMake 並點擊生成程式 ![image](https://hackmd.io/_uploads/S1Nqaj9bbx.png) 在 VSCode 開啟專案資料夾 ![image](https://hackmd.io/_uploads/rkI0poc-We.png) CMake 選擇預設模式 ![image](https://hackmd.io/_uploads/ryg_3nq-bx.png) 通常先選 Debug 正式推出再生成 Release 二進制檔 開啟任一 C 檔案 安裝 C/C++ 套件 ![image](https://hackmd.io/_uploads/Hkvm6nqZbe.png) 可隨時切換 CMake 模式 ![image](https://hackmd.io/_uploads/rkina2cZZe.png) 可新增 RelWithDebInfo 與 MinSizeRel 模式 修改 CMakePresets.json ```json { "version": 3, "configurePresets": [ { "name": "default", "hidden": true, "generator": "Ninja", "binaryDir": "${sourceDir}/build/${presetName}", "toolchainFile": "${sourceDir}/cmake/gcc-arm-none-eabi.cmake", "cacheVariables": { } }, { "name": "Debug", "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" } }, { "name": "RelWithDebInfo", "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "RelWithDebInfo" } }, { "name": "Release", "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } }, { "name": "MinSizeRel", "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "MinSizeRel" } } ], "buildPresets": [ { "name": "Debug", "configurePreset": "Debug" }, { "name": "RelWithDebInfo", "configurePreset": "RelWithDebInfo" }, { "name": "Release", "configurePreset": "Release" }, { "name": "MinSizeRel", "configurePreset": "MinSizeRel" } ] } ``` Debug 的方式 ![image](https://hackmd.io/_uploads/BybwNRh5bZx.png) 若要生成 bin 與 hex 檔案 在 CMakeLists.txt 最後新增 ```CMake find_program(ARM_OBJCOPY arm-none-eabi-objcopy REQUIRED) set(ELF_FILE $<TARGET_FILE:${CMAKE_PROJECT_NAME}>) # CMake 會自動產生 .elf set(BIN_FILE ${CMAKE_PROJECT_NAME}.bin) set(HEX_FILE ${CMAKE_PROJECT_NAME}.hex) add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${ARM_OBJCOPY} -O binary ${ELF_FILE} ${BIN_FILE} COMMAND ${ARM_OBJCOPY} -O ihex ${ELF_FILE} ${HEX_FILE} COMMENT "Generating ${BIN_FILE} and ${HEX_FILE}" ) set_property(TARGET ${CMAKE_PROJECT_NAME} APPEND PROPERTY ADDITIONAL_CLEAN_FILES ${CMAKE_PROJECT_NAME}.bin ${CMAKE_PROJECT_NAME}.hex ) ```