news 2025/12/26 16:36:01

[G32R] 使用 vscode+cmake 开发 G32R501

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[G32R] 使用 vscode+cmake 开发 G32R501

概述
目前极海官方提供的 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 文件夹
用户项目文件夹。

子目录需要满足以下的目录结构:

复制
  1. ├─INC---头文件目录
  2. └─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 的内容。文中以“#”开始的行为注释行,可以参考注释行理解相关内容。

复制
  1. # Geehy, G32R5xx
  2. cmake_minimum_required(VERSION 3.20)
  3. cmake_policy(SET CMP0123 NEW)
  4. project(g32r5xx_fw)
  5. set(TARGET_NAME g32r5xx_fw)
  6. # 检查 SDK 目录
  7. set(SDK_ROOT G32R5xx_SDK)
  8. get_filename_component(SDK_ROOT_ABS${SDK_ROOT}ABSOLUTE)
  9. if(NOT EXISTS${SDK_ROOT_ABS})
  10. message(FATAL_ERROR"SDK_ROOT: "${SDK_ROOT}" is not exists")
  11. endif()
  12. # 检查 APP 目录
  13. get_filename_component(APP_ROOT_ABS${APP_ROOT}ABSOLUTE)
  14. if(NOT EXISTS${APP_ROOT_ABS})
  15. message(FATAL_ERROR"APP_ROOT: "${APP_ROOT}" is not exists")
  16. endif()
  17. # 检查分散加载文件
  18. set(SCATTER_FILE_ABS${SDK_ROOT_ABS}/device_support/g32r501/common/sct/${SCATTER_FILE})
  19. if(NOT EXISTS${SCATTER_FILE_ABS})
  20. message(FATAL_ERROR"SCATTER_FILE: "${SCATTER_FILE_ABS}" is not exists")
  21. endif()
  22. # 打印项目信息
  23. message(STATUS"LIBRARY_TYPE:${LIBRARY_TYPE}")
  24. message(STATUS" SDK_ROOT:${SDK_ROOT_ABS}")
  25. message(STATUS" APP_ROOT:${APP_ROOT_ABS}")
  26. message(STATUS"SCATTER_FILE:${SCATTER_FILE_ABS}")
  27. # 编译选项
  28. set(MCPU_FLAGS"-mcpu=cortex-m52+cdecp0+pacbti -mfloat-abi=hard -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -mlittle-endian -ffunction-sections")
  29. set(CMAKE_C_FLAGS"${CMAKE_CXX_FLAGS}${MCPU_FLAGS}")
  30. set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}${MCPU_FLAGS}")
  31. 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")
  32. # 源码
  33. file(GLOB APP_SRC${APP_ROOT_ABS}/source/*c)
  34. add_executable(${TARGET_NAME}
  35. ${APP_SRC}
  36. )
  37. set_target_properties(${TARGET_NAME}PROPERTIES SUFFIX".axf")
  38. # 宏定义
  39. 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")
  40. # include 目录
  41. target_include_directories(${TARGET_NAME}PRIVATE${APP_ROOT}/INC)
  42. target_include_directories(${TARGET_NAME}PRIVATE${APP_ROOT}/include)
  43. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/device_support/g32r501/common/device/Geehy)
  44. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/device_support/g32r501/common/device/CMSIS/Core/Include)
  45. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/device_support/g32r501/common/device/Geehy/system_eval/include)
  46. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/device_support/g32r501/common/include)
  47. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/driverlib/g32r501/driverlib)
  48. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/driverlib/g32r501/driverlib/inc)
  49. # SDK 源码
  50. file(GLOB_RECURSE CMSIS_SRC${SDK_ROOT_ABS}/device_support/g32r501/common/device/Geehy/*.c)
  51. target_sources(${TARGET_NAME}PRIVATE${CMSIS_SRC})
  52. file(GLOB DRIVERLIB_SRC${SDK_ROOT_ABS}/driverlib/g32r501/driverlib/*.c)
  53. target_sources(${TARGET_NAME}PRIVATE${DRIVERLIB_SRC})
  54. target_sources(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/device_support/g32r501/common/source/device.c)
  55. # devicelib 类型项目必须添加的源码
  56. if(${LIBRARY_TYPE}STREQUAL"device_lib")
  57. file(GLOB DEVICE_SUPPORT_SRC${SDK_ROOT_ABS}/device_support/g32r501/common/source/*.c)
  58. list(APPEND DEVICE_SUPPORT_SRC${SDK_ROOT_ABS}/device_support/g32r501/common/g32r501_globalvariabledefs.c)
  59. target_include_directories(${TARGET_NAME}PRIVATE${SDK_ROOT_ABS}/device_support/g32r501/headers/include)
  60. target_sources(${TARGET_NAME}PRIVATE${DEVICE_SUPPORT_SRC})
  61. endif()
  62. # 生成 HEX 文件
  63. add_custom_command(TARGET${TARGET_NAME}POST_BUILD
  64. COMMAND${FROMELF_EXECUTABLE}--i32 --output${TARGET_NAME}.hex [ DISCUZ_CODE_50 ]lt;TARGET_FILE:${TARGET_NAME}>
  65. COMMENT"Creating HEX file")
  66. # 生成 BIN 文件
  67. add_custom_command(TARGET${TARGET_NAME}POST_BUILD
  68. COMMAND${FROMELF_EXECUTABLE}--bin --output${TARGET_NAME}.bin [ DISCUZ_CODE_50 ]lt;TARGET_FILE:${TARGET_NAME}>
  69. COMMENT"Creating HEX file")


工程构建
使用 CMake 搭建的开发C/C++工程,编译前需要先进行配置(configure)再进行编译。

配置
执行类似下面的命令行可以配置一个工程:

复制
  1. 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-GNinja


参数说明:

  • 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_support\g32r501\common\sct 目录。
  • APP_ROOT:STRING=projects/app1 用户项目目录



打开命令行窗口,切换到工程根目录。执行上述命令前,请先定义一个环境变量ARMCLANG_PATH,值是 armclang.exe 所在目录:

复制
  1. setARMCLANG_PATH=C:\Users\<USER_NAME>\AppData\Local\Keil_v5\ARM\ARMCLANG\bin


其中 C:\Users\<USER_NAME>\AppData\Local\Keil_v5\ARM\ARMCLANG\bin 就是我的电脑上 ARM-CLANG 编译器的目录,请替换成实际值。

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

复制
  1. 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 一些语法

变量

复制
  1. set(TARGET_NAME g32r5xx_fw)


上面的 set 语句定义了一个名为 TARGET_NAME 的变量,赋值:g32r5xx_fw。需要使用变量的值,需要用 \$\{\} 包含变量名,如:\$\{TARGET_NAME\}。

显示/打印信息

复制
  1. message(FATAL_ERROR"SCATTER_FILE "${SCATTER_FILE}" is not exists")message(STATUS"TOP_DIR:${TOP_DIR}")


message 可以在配置过程中显示/打印一些信息。如果是 FATAL_ERROR 类型的信息,表明发生严重错误,配置构建过程立即结束,配置失败。

获取文件夹下的源文件列表

复制
  1. 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 代码文件(递归)。
如果只是个别文件,可以这样写:

复制
  1. 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。


/// 全文完




---------------------
作者:wangqy_ic
链接:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3456794
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/21 22:50:32

【2025全球网络安全现状】人才老化、AI崛起、压力攀升…

【网络安全收藏必看】2025趋势报告&#xff1a;适应性超越经验&#xff0c;成为人才核心竞争力 ISACA最新报告揭示网络安全领域正经历重要变革&#xff1a;适应性首次超越工作经验成为首要素质&#xff1b;行业面临老龄化加剧、软技能缺口扩大等挑战&#xff1b;尽管工作压力增…

作者头像 李华
网站建设 2025/12/21 22:38:45

Thinkphp和Laravel在线跑腿系统--论文vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravel在线跑腿系统–论文vue 项目开发技术…

作者头像 李华
网站建设 2025/12/21 22:38:36

Thinkphp和Laravel重点人员信息查询系统vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravel重点人员信息查询系统vue 项目开发技术…

作者头像 李华
网站建设 2025/12/21 22:26:41

堆排序和topk问题

系列文章目录 文章目录系列文章目录前言一、堆排序定义二、时间复杂度三、实现思路a.注意&#xff08;升/降&#xff09;四、topk问题前言 常见的基本排序算法有冒泡、选择、插入&#xff0c;但效率太低。 堆排序和快速排序算法则是相对高效的算法。这篇主要先介绍堆排序 一、…

作者头像 李华
网站建设 2025/12/21 22:24:45

Java毕设项目推荐-基于springboot的幼儿园管理系统的设计与实现家校互动(通知推送、留言沟通)、膳食营养规划【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2025/12/21 22:24:38

Java毕设项目推荐-基于springboot小区团购管理设计与实现基于springboot的社区团购系统的设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华