0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用vscode和cmake工具开发极海G32R501 MCU

Geehy极海半导体 来源:Geehy极海半导体 2025-11-25 14:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《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 提供。

文件组织

为便于叙述,本文约定了如下的文件组织形式:

4511a1ec-c527-11f0-8c8f-92fbcf53809c.png

下面一一描述各项内容:

.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:UsersAppDataLocalKeil_v5ARMARMCLANGin

其中 C:UsersAppDataLocalKeil_v5ARMARMCLANGin 就是我的电脑上 ARM-CLANG 编译器的目录,请替换成实际值。

编译

在命令行里执行如下命令,就可以编译整个工程:

ninja -C _build

编译的固件会在 _build 文件夹下:g32r5xx_fw.hex 和 g32r5xx_fw.bin。

在 VS Code 里编辑和编译

“一个小手术”

为了能让 VS Code 更好地工作,我们在打开 VS Code 前,先弄好 VS Code 的配置。在 .vsode 下,用文本编辑器创建 settings.json 文件,并写入如下内容:

456f3794-c527-11f0-8c8f-92fbcf53809c.png

文件中cmake.configureArgs部分内容与前文所述的“配置”部分大致相同,作用也就很明显了。这些参数控制着 VS Code 更好的为我们工作。

经过前面的步骤,就可以启动 VS Code 打开工程所在根目录,就可以在 VS Code 里愉快地编码了。

更便捷地使用 VS Code

VS Code 提供了“任务”机制能让我们更好地进行开发。这里列举作者认为非常有助于提高效率的一个功能:实现“一键下载”。

点击 VS Code 菜单【终端】→ 【配置任务...】,在弹出的下拉列表里,选择【使用模板创建 tasks.json 文件】→ 【Others 运行任意外部命令的示例】。操作完成后会在 .vscode 目录下生成一个 tasks.json 文件,并打开。编辑这个文件:

45cf90d0-c527-11f0-8c8f-92fbcf53809c.png

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
    IDE
    +关注

    关注

    0

    文章

    368

    浏览量

    49231
  • 开发环境
    +关注

    关注

    1

    文章

    275

    浏览量

    17680
  • vscode
    +关注

    关注

    1

    文章

    173

    浏览量

    9281
  • 极海半导体
    +关注

    关注

    0

    文章

    225

    浏览量

    4825

原文标题:APM32芯得 EP.66 | 使用 vscode+cmake 开发 G32R501

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    G32R501数据手册# 内置FPU,支持 Arm Helium,实时控制 MCU

    G32R501实时控制MCU : 基本信息 : G32R5系列实时控制MCU搭载Arm v8
    的头像 发表于 02-19 13:58 3561次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>数据手册# 内置FPU,支持 Arm Helium,实时控制 <b class='flag-5'>MCU</b>

    使用CMake+VSCode环境移植ThreadX到G32R501 MCU

    我本人是 cmake+vscode 组合的忠实用户,之前写了一篇文章介绍了在 cmake+vscode 环境下开发 G32R501 的一些实践经验。这篇文章准备更进一步:移植一个Thr
    的头像 发表于 03-09 14:04 2684次阅读
    使用<b class='flag-5'>CMake+VSCode</b>环境移植ThreadX到<b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b> <b class='flag-5'>MCU</b>

    Cortex-M52内核MCU G32R501在CoreMark的表现如何

    要真正衡量一颗MCU的运算实力,CoreMark成绩往往是一个比较客观、公认的参考指标。到底这个G32R501跑起CoreMark来能交出怎样的成绩单?今天就让我们一起“探秘”一番,看这款Cortex-M52 MCU在CoreM
    的头像 发表于 03-09 14:09 4013次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b>Cortex-M52内核<b class='flag-5'>MCU</b> <b class='flag-5'>G32R501</b>在CoreMark的表现如何

    G32R501实时控制 MCU 跨域新境界丨面向新一代高效能高实时控制设备

    首款基于Arm® Cortex®-M52双核架构的实时控制MCU——G32R501渠道
    发表于 01-07 18:06 1664次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>实时控制 <b class='flag-5'>MCU</b> 跨域新境界丨面向新一代高效能高实时控制设备

    32 位 MCU 开发调试 ,基于 VS Code 插件实现芯 32 位 MCU 开发调试

    编译/链接等脚本语法,只需要简单配置参数、新建工程、增加代码文件后,就可以开始编译 和调试了。如果要生成静态库文件也只需要修改输出格式,再编译就可能生成.a 的文件。*附件:基于VSCode插件实现芯32位MCU
    发表于 05-16 10:46

    AN016基于CMAKE工具搭建GD32MCU开发环境

    AN016 基于CMAKE工具搭建GD32 MCU开发环境
    发表于 02-27 18:20 4次下载
    AN016基于<b class='flag-5'>CMAKE</b><b class='flag-5'>工具</b>搭建GD32<b class='flag-5'>MCU</b><b class='flag-5'>开发</b>环境

    高效双控 精准卓越 | G32R501低压无感双电机参考方案

    降低成本、提高系统可靠性以及简化电机结构方面具有显著优势。 随着无传感器电机控制技术的逐步成熟,其在工业自动化、旋翼飞行器、空调外机等领域迎来广阔的市场应用前景。紧跟行业技术发展趋势,推出G32R501低压无感双
    发表于 01-16 16:12 827次阅读
    高效双控 精准卓越 | <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>低压无感双电机参考方案

    发布G32R5xx SDK,简化MCU软件迁移

    近日,正式推出了其最新的G32R5xx SDK(软件开发工具包)。这款SDK以其高兼容性设计为核心亮点,旨在显著简化实时控制微控制器(MCU
    的头像 发表于 02-18 13:57 1545次阅读

    高效转换 实时调控 | 基于G32R501的800W双路MPPT微型逆变器参考方案

    ,更是推动绿色能源普及的重要技术载体。 推出G32R501 800W双路MPPT微型逆变器参考方案,旨在以更高效、更智能的量产级技术方案,助力全球能源转型。该方案通过G32R501
    发表于 02-26 11:07 754次阅读
    高效转换 实时调控 | 基于<b class='flag-5'>G32R501</b>的800W双路MPPT微型逆变器参考方案

    半导体荣登2025中国IC设计Fabless100排行榜之TOP10微控制器公司

    近日,在“中国IC设计成就奖”颁奖典礼中,微上榜中国微控制器公司Top 10,G32R501实时控制MCU斩获“2025年度MCU”奖,
    的头像 发表于 04-01 09:43 2252次阅读

    半导体全数字双向电源参考方案助力能效跃升

    半导体凭借在工业应用领域深厚的技术积累,推出了基于G32R501实时控制MCU的全数字双向电源参考方案,该方案具备高效率、高可靠、高转换率、低噪声和高性价比等特点,为企业应对关税冲
    的头像 发表于 04-12 14:15 1181次阅读

    半导体G32R501:面向具身机器人的高性能、高安全实时控制MCU/DSP

    要求。     今天,在第十五届松山湖中国IC创新高峰论坛中,珠海半导体有限公司实时控制MCU/DSP产品线高级产品经理卢鹏升带来了面向具身机器人的高性能、高安全实时控制MCU/D
    发表于 05-13 12:12 1679次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b>半导体<b class='flag-5'>G32R501</b>:面向具身机器人的高性能、高安全实时控制<b class='flag-5'>MCU</b>/DSP

    G32R501工业六轴机械臂参考方案释放工业4.0产业价值

    挥着重要作用,是现代工业自动化和智能化生产的核心工具。据Grand View Research数据分析,2024年全球工业机器人市场规模约为340亿美元,预计2025年至2030年将以9.9%的复合年增长率持续增长,展现出巨大的市场潜力。
    发表于 06-23 13:52 1993次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>工业六轴机械臂参考方案释放工业4.0产业价值

    特来电携手半导体推出G32R501T实时控制MCU

    联合开发G32R501T实时控制MCU,这不仅是对AI智能充电与新能源领域核心技术的一次深度定义,更标志着高端电源主控芯片朝着自主化、智能化迈出坚实一步。
    的头像 发表于 11-04 09:21 1090次阅读

    G32R501芯片与Jlink适配的过程解析

    适配芯片至Jlink,网上已经有许许多多的博客介绍了,但今天我们的主角G32R501不太一般,要是我们按照普通的芯片适配流程,大家会发现在最终对芯片进行程序进行下载的时候无法成功,那这是为什么呢?本文给大家介绍一下G32R501芯片,在适配Jlink的正确姿势!
    的头像 发表于 02-25 13:47 682次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>G32R501</b>芯片与Jlink适配的过程解析