GD32F470ZGT6梁山派 CMake 模板工程创建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、开发环境搭建
    • [1. 安装交叉编译工具链](#1. 安装交叉编译工具链)
    • [2. 安装 CMake 构建系统](#2. 安装 CMake 构建系统)
    • [3. 安装 OpenOCD 烧录调试工具](#3. 安装 OpenOCD 烧录调试工具)
    • [4. 安装串口工具(可选)](#4. 安装串口工具(可选))
  • [二、获取 GD32 SDK](#二、获取 GD32 SDK)
  • [三、CMake 工程配置](#三、CMake 工程配置)
    • [1. 创建 CMakeLists.txt](#1. 创建 CMakeLists.txt)
    • [2. 配置头文件路径](#2. 配置头文件路径)
    • [3. 收集源文件](#3. 收集源文件)
    • [4. 编译宏定义](#4. 编译宏定义)
  • 四、编译工程
  • 五、烧录固件
    • [1. OpenOCD 配置](#1. OpenOCD 配置)
    • [2. 一键烧录脚本](#2. 一键烧录脚本)
  • 六、调试功能
    • [1. GDB 在线调试](#1. GDB 在线调试)
    • [2. 串口调试(USART0)](#2. 串口调试(USART0))
  • 七、工程目录整理
    • [1. 目录结构优化](#1. 目录结构优化)
    • [2. 头文件统一管理](#2. 头文件统一管理)
    • [3. CMake 路径更新](#3. CMake 路径更新)
  • [八、内置 Demo 功能](#八、内置 Demo 功能)
    • [1. 跑马灯 Demo](#1. 跑马灯 Demo)
    • [2. 精确延时实现](#2. 精确延时实现)
    • [3. 串口调试输出](#3. 串口调试输出)
  • [九、SDK 内置功能概览](#九、SDK 内置功能概览)
    • [1. 标准外设驱动](#1. 标准外设驱动)
    • [2. 中间件](#2. 中间件)
  • 总结

前言

本文详细记录了基于 CMake 的 GD32F470ZGT6 工程模板的完整搭建过程,涵盖环境搭建、SDK 配置、CMake 工程创建、编译烧录、调试功能以及工程目录整理等全流程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、开发环境搭建

1. 安装交叉编译工具链

GD32F470ZGT6 是 ARM Cortex-M4 内核芯片,需要使用 arm-none-eabi 交叉编译工具链。

bash 复制代码
sudo apt update
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi

验证安装:

bash 复制代码
arm-none-eabi-gcc --version

2. 安装 CMake 构建系统

bash 复制代码
sudo apt install cmake
cmake --version

3. 安装 OpenOCD 烧录调试工具

bash 复制代码
sudo apt install openocd
openocd --version

4. 安装串口工具(可选)

bash 复制代码
sudo apt install picocom minicom

二、获取 GD32 SDK

从兆易创新官网下载 GD32F4xx_Firmware_Library_V3.3.3.zip,解压后将核心目录复制到工程:

复制代码
sdk/
├── firmware/
│   ├── CMSIS/                          # ARM CMSIS 核心文件
│   ├── GD32F4xx_standard_peripheral/   # 标准外设驱动
│   └── GD32F4xx_usb_library/           # USB 协议栈
└── utilities/                          # 工具文件

三、CMake 工程配置

1. 创建 CMakeLists.txt

在项目根目录创建 CMakeLists.txt

cmake 复制代码
cmake_minimum_required(VERSION 3.16)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)

# 交叉编译工具链
set(TOOLCHAIN_PREFIX "arm-none-eabi" CACHE STRING "Toolchain prefix")
set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}-gcc")
set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PREFIX}-gcc")

# Cortex-M4 + 硬件 FPU 编译参数
set(TARGET_ARCH_FLAGS "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(CMAKE_C_FLAGS "${TARGET_ARCH_FLAGS} -fdata-sections -ffunction-sections -Wall")
set(CMAKE_EXE_LINKER_FLAGS "${TARGET_ARCH_FLAGS} -specs=nano.specs -specs=nosys.specs -Wl,--gc-sections")

project(gd32f470-template C ASM)

2. 配置头文件路径

cmake 复制代码
include_directories(
    ${SDK_ROOT}/firmware/CMSIS
    ${SDK_ROOT}/firmware/CMSIS/GD/GD32F4xx/Include
    ${SDK_ROOT}/firmware/GD32F4xx_standard_peripheral/Include
    ${PROJ_ROOT}/include
    ${PROJ_ROOT}/app
    ${PROJ_ROOT}/system
)

3. 收集源文件

cmake 复制代码
file(GLOB PERIPHERAL_SOURCES "${SDK_ROOT}/firmware/GD32F4xx_standard_peripheral/Source/gd32f4xx_*.c")
file(GLOB APP_SOURCES ${PROJ_ROOT}/app/*.c)

add_executable(${CMAKE_PROJECT_NAME}.elf ${PERIPHERAL_SOURCES} ${SYSTEM_SOURCES} ${STARTUP_SOURCES} ${APP_SOURCES})

4. 编译宏定义

cmake 复制代码
target_compile_definitions(${CMAKE_PROJECT_NAME}.elf PRIVATE
    GD32F470
    HXTAL_VALUE=25000000
)

四、编译工程

bash 复制代码
mkdir build && cd build
cmake ..
make -j4

编译后生成的文件:

文件 用途
gd32f470-template.elf ELF 可执行文件(GDB 调试)
gd32f470-template.hex Intel HEX 格式(烧录用)
gd32f470-template.bin 二进制镜像
gd32f470-template.map 链接映射文件

五、烧录固件

1. OpenOCD 配置

创建 flash/gd32f470.cfg

复制代码
set WORKAREASIZE 0x10000
source [find target/stm32f4x.cfg]

GD32F4xx 与 STM32F4xx 引脚和 Flash 兼容,可直接使用 stm32f4x 配置。

2. 一键烧录脚本

创建 flash/flash.sh

bash 复制代码
#!/bin/bash
sudo openocd -f interface/cmsis-dap.cfg -f flash/gd32f470.cfg \
    -c "program build/gd32f470-template.elf verify reset exit"

执行烧录:

bash 复制代码
./flash/flash.sh

六、调试功能

1. GDB 在线调试

bash 复制代码
./debug/gdb.sh

自动启动 OpenOCD 并连接 GDB,断点停在 main() 函数。

2. 串口调试(USART0)

参数
串口 USART0 (PA9/TX, PA10/RX)
波特率 115200
数据位 8
停止位 1

打开串口终端:

bash 复制代码
./debug/serial.sh

七、工程目录整理

1. 目录结构优化

将原始的 src/ 目录重命名为项目名 myprog/,符合大厂工程规范:

复制代码
myprog/
├── app/           # 应用层代码 (.c 源文件)
├── include/       # 头文件统一目录 (.h 文件)
├── startup/       # 启动文件
└── system/        # 系统级文件

2. 头文件统一管理

所有 .h 头文件统一放入 myprog/include/ 目录,包括:

  • main.h - 主程序头文件
  • debug.h - 串口调试头文件
  • gd32f4xx_libopt.h - 固件库功能裁剪配置

3. CMake 路径更新

同步更新 CMakeLists.txt 中的路径引用:

cmake 复制代码
set(PROJ_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/myprog")

include_directories(${PROJ_ROOT}/include)

八、内置 Demo 功能

1. 跑马灯 Demo

4 个 LED 依次点亮,每秒切换一个:

LED 引脚 端口
LED1 PE3 GPIOE
LED2 PD7 GPIOD
LED3 PG3 GPIOG
LED4 PA5 GPIOA

2. 精确延时实现

使用 SysTick 硬件定时器实现精确毫秒延时:

c 复制代码
static volatile uint32_t g_tick_count = 0;

void SysTick_Handler(void) {
    g_tick_count++;  // 每 1ms 中断一次
}

void delay_ms(uint32_t ms) {
    uint32_t tick_start = g_tick_count;
    while((g_tick_count - tick_start) < ms) {
        __NOP();
    }
}

3. 串口调试输出

启动后通过 USART0 输出:

复制代码
==============================
GD32F470ZGT6 Running Light Demo
System Clock: 200 MHz
==============================
LED1 ON | Loop: 0
LED2 ON | Loop: 0
...

九、SDK 内置功能概览

1. 标准外设驱动

模块 描述
GPIO 通用输入输出端口
USART/UART 串口通信
SPI SPI 总线接口
I2C I2C 总线接口
ADC 模数转换器 (12-bit)
TIMER 通用定时器
CAN 控制器局域网总线
USBFS/USBHS USB 控制器
ENET 以太网控制器
RTC 实时时钟

2. 中间件

模块 描述
USB Device Stack CDC/HID/MSC/DFU/IAP/Audio
USB Host Stack HID/MSC
FatFS FAT 文件系统

总结

以上就是 GD32F470ZGT6 CMake 模板工程的完整搭建流程,从环境搭建、SDK 配置、CMake 工程创建到编译烧录和目录整理,覆盖了嵌入式开发的各个环节。工程已具备:

  • 完整的 CMake 交叉编译配置
  • OpenOCD + CMSIS-DAP 一键烧录方案
  • GDB 在线调试支持
  • 串口调试模块 (USART0)
  • 跑马灯 Demo (SysTick 精确延时)
  • 规范的工程目录结构 (myprog/app, myprog/include)

基于此模板可快速扩展其他外设驱动和应用功能。

相关推荐
追兮兮2 天前
基于 GD32 与 LwIP 的 TCP OTA 固件升级实现
网络·网络协议·tcp/ip·tcp·gd32·ota
番茄灭世神16 天前
MCU开发常见软件BUG总结(持续更新)
c语言·stm32·单片机·嵌入式·gd32
记录无知岁月21 天前
【GD32】(二) 基本外设使用
单片机·can·iic·gd32·dwt
漠落22 天前
GD32替换STM32导致ADC卡顿问题解析
stm32·单片机·gd32
番茄灭世神1 个月前
空气质量检测仪项目笔记——硬件介绍
stm32·单片机·嵌入式·gd32·国产芯片
qq_341581172 个月前
GD32E103CBT6+freeRTOS
freertos·gd32
番茄灭世神3 个月前
基于VScode搭建GD32开发环境
arm开发·vscode·单片机·cmake·gd32
遇雪长安4 个月前
Cortex-Debug使用PyOCD超时问题
vscode·gd32·pyocd·daplink·cortex-debug
番茄灭世神4 个月前
32位ARM单片机视频教程第一篇
arm开发·单片机·嵌入式·gd32·pn学堂