《APM32芯得》系列內容為用戶使用APM32系列產品的經驗總結,均轉載自21ic論壇極海半導體專區,全文未作任何修改,未經原文作者授權禁止轉載。
概述
目前極海官方提供的 IDE 開發環境有 Keil/IAR/Eclipse。都能很好的完成開發,但是 VS Code 配合 CMake 工具是更加“現代”的C/C++開發環境,本文提供了在 VS Code 環境下的開發經驗,以供參考。
準備工作
必需的軟件有:
cmake: 官網 https://cmake.org
ninja: 官網 https://ninja-build.org
VS Code:官網 https://code.visualstudio.com
arm-clang 編譯套件,keil 自帶~
請從上述網站下載所需軟件,版本采用最新版即可。此外,為了更好的使用 VS Code,還需要安裝兩個擴展:
C/C++ Extension Pack
CMake Tools
這里不再贅述擴展的安裝方法。
Note:
ninja 的功能,也可以由 make 提供。
文件組織
為便于敘述,本文約定了如下的文件組織形式:

下面一一描述各項內容:
.vscode 文件夾
VS Code 的配置文件夾。
cmake 文件夾
針對編譯器的必需文件。
G32R501_SDK 文件夾
G32R501 SDK 庫,直接使用極海官網提供的 SDK 庫。解壓縮文件時請確保文件層級與上文所列一致。
projects 文件夾
用戶項目文件夾。
子目錄需要滿足以下的目錄結構:
├─INC --- 頭文件目錄
└─SRC --- C 文件 目錄
如果實際目錄結構與上面的不一致,則需要修改 CMakeLists.txt 文件。
CMakeLists.txt 文件
CMake 構建所必需的文件,下一節會詳細說明。
詳細說明
CMakeLists.txt 文件
CMake 構建 C/C++ 工程,是從工程根目錄(或者指定的某個目錄)下的 CMakeLists.txt 文件開始。CMakeLists.txt 描述了構建工程的源代碼,編譯選項。CMake 工具根據這個文件生成 Makefile 或者 ninja.build 文件。最后由 make 工具或者 ninja 工具執行編譯工作。
CMakeLists.txt 遵循 CMake 相關語法,具體可以參考官方說明或者相應教程。這里貼出了 CMakeLists.txt 的內容。文中以“#”開始的行為注釋行,可以參考注釋行理解相關內容。
# Geehy, G32R5xx
cmake_minimum_required(VERSION 3.20)
cmake_policy(SET CMP0123 NEW)
project(g32r5xx_fw)
set(TARGET_NAME g32r5xx_fw)
# 檢查 SDK 目錄
set(SDK_ROOT G32R5xx_SDK)
get_filename_component(SDK_ROOT_ABS ${SDK_ROOT} ABSOLUTE)
if(NOT EXISTS ${SDK_ROOT_ABS})
message(FATAL_ERROR "SDK_ROOT: "${SDK_ROOT}" is not exists")
endif()
# 檢查 APP 目錄
get_filename_component(APP_ROOT_ABS ${APP_ROOT} ABSOLUTE)
if(NOT EXISTS ${APP_ROOT_ABS})
message(FATAL_ERROR "APP_ROOT: "${APP_ROOT}" is not exists")
endif()
# 檢查分散加載文件
set(SCATTER_FILE_ABS ${SDK_ROOT_ABS}/device_support/g32r501/common/sct/${SCATTER_FILE})
if(NOT EXISTS ${SCATTER_FILE_ABS})
message(FATAL_ERROR "SCATTER_FILE: "${SCATTER_FILE_ABS}" is not exists")
endif()
# 打印項目信息
message(STATUS "LIBRARY_TYPE: ${LIBRARY_TYPE}")
message(STATUS " SDK_ROOT: ${SDK_ROOT_ABS}")
message(STATUS " APP_ROOT: ${APP_ROOT_ABS}")
message(STATUS "SCATTER_FILE: ${SCATTER_FILE_ABS}")
# 編譯選項
set(MCPU_FLAGS "-mcpu=cortex-m52+cdecp0+pacbti -mfloat-abi=hard -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -mlittle-endian -ffunction-sections")
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} ${MCPU_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MCPU_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --strict --scatter ${SCATTER_FILE_ABS} --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list project.map")
# 源碼
file(GLOB APP_SRC ${APP_ROOT_ABS}/source/*c)
add_executable(${TARGET_NAME}
${APP_SRC}
)
set_target_properties(${TARGET_NAME} PROPERTIES SUFFIX ".axf")
# 宏定義
target_compile_definitions(${TARGET_NAME} PRIVATE "-DG32R501_EVAL -D__CORE_CPU0__ -D__G32R501XX__ -D__G32R501__ -D__ARM_ARCH_8_1M_MAIN___ -D__ARM_TARGET_COPROC")
# include 目錄
target_include_directories(${TARGET_NAME} PRIVATE ${APP_ROOT}/INC)
target_include_directories(${TARGET_NAME} PRIVATE ${APP_ROOT}/include)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/device_support/g32r501/common/device/Geehy)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/device_support/g32r501/common/device/CMSIS/Core/Include)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/device_support/g32r501/common/device/Geehy/system_eval/include)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/device_support/g32r501/common/include)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/driverlib/g32r501/driverlib)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/driverlib/g32r501/driverlib/inc)
# SDK 源碼
file(GLOB_RECURSE CMSIS_SRC ${SDK_ROOT_ABS}/device_support/g32r501/common/device/Geehy/*.c)
target_sources(${TARGET_NAME} PRIVATE ${CMSIS_SRC})
file(GLOB DRIVERLIB_SRC ${SDK_ROOT_ABS}/driverlib/g32r501/driverlib/*.c)
target_sources(${TARGET_NAME} PRIVATE ${DRIVERLIB_SRC})
target_sources(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/device_support/g32r501/common/source/device.c)
# devicelib 類型項目必須添加的源碼
if(${LIBRARY_TYPE} STREQUAL "device_lib")
file(GLOB DEVICE_SUPPORT_SRC ${SDK_ROOT_ABS}/device_support/g32r501/common/source/*.c)
list(APPEND DEVICE_SUPPORT_SRC ${SDK_ROOT_ABS}/device_support/g32r501/common/g32r501_globalvariabledefs.c)
target_include_directories(${TARGET_NAME} PRIVATE ${SDK_ROOT_ABS}/device_support/g32r501/headers/include)
target_sources(${TARGET_NAME} PRIVATE ${DEVICE_SUPPORT_SRC})
endif()
# 生成 HEX 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${FROMELF_EXECUTABLE} --i32 --output ${TARGET_NAME}.hex [ DISCUZ_CODE_50 ]lt;TARGET_FILE:${TARGET_NAME}>
COMMENT "Creating HEX file")
# 生成 BIN 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${FROMELF_EXECUTABLE} --bin --output ${TARGET_NAME}.bin [ DISCUZ_CODE_50 ]lt;TARGET_FILE:${TARGET_NAME}>
COMMENT "Creating HEX file")
工程構建
使用 CMake 搭建的開發C/C++工程,編譯前需要先進行配置(configure)再進行編譯。
配置
執行類似下面的命令行可以配置一個工程:
cmake -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_TOOLCHAIN_FILE:STRING=cmake/g32r501.cmake -DLIBRARY_TYPE:STRING=device_lib -DSCATTER_FILE:STRING=g32r501xe_cbus_flash.sct -DAPP_ROOT:STRING=projects/app1 -B_build -G Ninja
參數說明:
CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE 可選參數,用于生成 compile_commands.json 文件,便于 VS Code 開發使用。
CMAKE_TOOLCHAIN_FILE:STRING=cmake/g32r501.cmake 必選參數,指定 MCU 是 g32r501。
CMAKE_BUILD_TYPE:STRING=Debug 構建類型,可選的值有:Debug,Release,RelWithDebInfo 和 MinSizeRel,具體參考 cmake 文檔。
LIBRARY_TYPE:STRING=device_lib SDK 庫類型,可選值有:device_lib,driver_lib。
SCATTER_FILE:STRING=g32r501xe_cbus_flash.sct 分散加載文件的文件名,參考 G32R501_SDK*device_supportg32r501commonsct 目錄。
APP_ROOT:STRING=projects/app1 用戶項目目錄
打開命令行窗口,切換到工程根目錄。執行上述命令前,請先定義一個環境變量 ARMCLANG_PATH,值是 armclang.exe 所在目錄:
set ARMCLANG_PATH=C:Users
其中 C:Users
編譯
在命令行里執行如下命令,就可以編譯整個工程:
ninja -C _build
編譯的固件會在 _build 文件夾下:g32r5xx_fw.hex 和 g32r5xx_fw.bin。
在 VS Code 里編輯和編譯
“一個小手術”
為了能讓 VS Code 更好地工作,我們在打開 VS Code 前,先弄好 VS Code 的配置。在 .vsode 下,用文本編輯器創建 settings.json 文件,并寫入如下內容:

文件中cmake.configureArgs部分內容與前文所述的“配置”部分大致相同,作用也就很明顯了。這些參數控制著 VS Code 更好的為我們工作。
經過前面的步驟,就可以啟動 VS Code 打開工程所在根目錄,就可以在 VS Code 里愉快地編碼了。
更便捷地使用 VS Code
VS Code 提供了“任務”機制能讓我們更好地進行開發。這里列舉作者認為非常有助于提高效率的一個功能:實現“一鍵下載”。
點擊 VS Code 菜單【終端】→ 【配置任務...】,在彈出的下拉列表里,選擇【使用模板創建 tasks.json 文件】→ 【Others 運行任意外部命令的示例】。操作完成后會在 .vscode 目錄下生成一個 tasks.json 文件,并打開。編輯這個文件:

tasks.json 文件里 tasks列表定義了若干可執行的命令及響應的命令參數。上述示例中名為 “Flash(MDK)” 的任務實際調用 keil 進行燒錄;“Flash(JLINK)”任務是調用 JLink 進行燒錄。
開發人員可以照例編排其他任務以提高開發效率。
附錄
CMakeLists.txt 一些語法
變量
set(TARGET_NAME g32r5xx_fw)
上面的 set 語句定義了一個名為 TARGET_NAME 的變量,賦值:g32r5xx_fw。需要使用變量的值,需要用 ${} 包含變量名,如:${TARGET_NAME}。
顯示/打印信息
message(FATAL_ERROR "SCATTER_FILE "${SCATTER_FILE}" is not exists")message(STATUS "TOP_DIR: ${TOP_DIR}")
message 可以在配置過程中顯示/打印一些信息。如果是 FATAL_ERROR 類型的信息,表明發生嚴重錯誤,配置構建過程立即結束,配置失敗。
獲取文件夾下的源文件列表
file(GLOB APP_SRC ${APP_ROOT}/SRC/*.c)file(GLOB_RECURSE APP_SRC ${APP_ROOT}/SRC/*.c)
第一句獲取 ${APP_ROOT}/SRC 目錄下全部的 C 代碼文件。第二句獲取 ${APP_ROOT}/SRC 目錄及其子目錄下全部的 C 代碼文件(遞歸)。
如果只是個別文件,可以這樣寫:
set(APP_SRC ${APP_ROOT}/SRC/a.c ${APP_ROOT}/SRC/b.c ${APP_ROOT}/SRC/c.c)
一些內置的變量
cmake 有一些有用的內置變量:
CMAKE_SOURCE_DIR:指向頂級 CMakeLists.txt 文件所在的目錄,也稱為源目錄。
CMAKE_BINARY_DIR:指向構建目錄,即 CMake 構建的輸出目錄。
CMAKE_CURRENT_LIST_DIR: 當前 CMakeLists.txt 所在目錄。
CMAKE_BUILD_TYPE:指定構建類型,如 Debug、Release、RelWithDebInfo 和 MinSizeRel。
/// 全文完
注:文章作者在原帖中提供了代碼文件,有需要請至原文21ic論壇
-
IDE
+關注
關注
0文章
364瀏覽量
48767 -
開發環境
+關注
關注
1文章
254瀏覽量
17562 -
vscode
+關注
關注
1文章
171瀏覽量
9022 -
極海半導體
+關注
關注
0文章
197瀏覽量
4825
原文標題:APM32芯得 EP.66 | 使用 vscode+cmake 開發 G32R501
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
極海G32R501實時控制 MCU 跨域新境界丨面向新一代高效能高實時控制設備
實時自控 精準調速 | 極海G32R501 2.2kW高性能矢量變頻器參考方案
芯海 32 位 MCU 開發調試 ,基于 VS Code 插件實現芯海 32 位 MCU 開發調試
【CPKCOR-RA8D1】1、VSCODE+CMAKE開發環境搭建
極海于electronica 2024展示G32R5高性能實時控制MCU
高效雙控 精準卓越 | 極海G32R501低壓無感雙電機參考方案
極海發布G32R5xx SDK,簡化MCU軟件遷移
高效轉換 實時調控 | 基于G32R501的800W雙路MPPT微型逆變器參考方案
極海半導體榮登2025中國IC設計Fabless100排行榜之TOP10微控制器公司
極海半導體全數字雙向電源參考方案助力能效躍升
極海半導體G32R501:面向具身機器人的高性能、高安全實時控制MCU/DSP
極海G32R501工業六軸機械臂參考方案釋放工業4.0產業價值

使用vscode和cmake工具開發極海G32R501 MCU
評論