1. 搭建GD32F103最小系统板并点亮LED

任务目标

使用GD32F103C8T6芯片搭建可独立运行的最小系统板,编写并烧录程序点亮板载LED,以此验证开发环境、烧录链路与基本GPIO输出操作是否正常。

硬件准备与接线

  • GD32F103C8T6核心板(或自行焊接最小系统:芯片 + 8MHz晶振 + 两个22pF负载电容 + 10kΩ上拉复位电阻 + 3.3V供电 + 0.1μF去耦电容)
  • LED串联330Ω电阻,阳极接PB0,阴极接GND
  • ST-Link/V2调试器(SWD接口:SWDIO、SWCLK、GND、3.3V)
  • USB转TTL串口模块(仅烧录时使用可选,推荐ST-Link直接烧录)

软件环境

  • Keil MDK-ARM 5.30+ 或 支持ARMCC/AC6的版本
  • GD32F10x固件库(从GigaDevice官网下载,或使用寄存器直接操作——本案例采用寄存器方式,无需固件库)
  • ST-Link驱动及烧录工具(Keil内配置即可)

核心代码实现

以下代码直接操作寄存器完成GPIOB时钟使能、PB0配置为推挽输出并循环翻转电平,实现LED闪烁。代码不依赖任何固件库,仅需芯片头文件定义寄存器地址。

// main.c — GD32F103C8T6 最小系统LED闪烁
#include "gd32f10x.h"          // 芯片寄存器地址定义

void delay_volatile(void) {
    volatile uint32_t i;
    for (i = 0; i < 500000; i++);   // 软件延时,约0.2s@72MHz
}

int main(void) {
    // 1. 使能GPIOB时钟(APB2总线,位3对应GPIOBEN)
    RCC->APB2ENR |= (1 << 3);
    
    // 2. 配置PB0为推挽输出,最大速度50MHz
    //    CRL寄存器控制PIN0~7,每PIN占4位:MODE=11(50MHz),CNF=00(推挽)
    GPIOB->CRL &= ~(0xF << 0);    // 先清空PB0配置位
    GPIOB->CRL |= (0x3 << 0);     // MODE=11, CNF=00 → 通用推挽输出
    
    while (1) {
        GPIOB->ODR ^= (1 << 0);   // 翻转PB0电平
        delay_volatile();
    }
}

编译与烧录步骤

  1. 在Keil中新建工程,芯片选择GD32F103C8(若列表无此型号,需安装GD32设备支持包)。
  2. 将上述代码保存为main.c并加入工程。
  3. 工程配置中勾选Use MicroLIB(减小代码体积),并设置烧录器为ST-Link Debugger,在Settings中确认能识别到SWD设备。
  4. 编译工程,确认0 Error。点击Download烧录程序。

验证方法与通过标准

  • 烧录成功后,按下核心板复位键(或重新上电),观察LED状态。
  • 通过条件:LED以约2.5Hz频率持续闪烁(亮0.2s灭0.2s)。若LED常亮或常灭,检查PB0接线极性、LED是否损坏、代码中CRL配置是否正确。
  • 若下载时提示No target connected,检查ST-Link与SWD四线连接是否牢固,核心板是否已供电。

常见问题排查

  • 芯片无法识别:确认BOOT0引脚接GND(正常运行模式),BOOT1悬空即可。
  • LED不亮但程序已烧录:用万用表测量PB0引脚电压,正常应在0V与3.3V间跳变。若无跳变,检查CRL寄存器配置是否被后续代码意外修改。
  • 软件延时时间不准:本案例未配置系统时钟,芯片默认使用内部8MHz RC振荡器,延时约0.2s。若需精确延时,需在main开头配置PLL锁相环将主频提升至72MHz。

本案例验证通过后,即证明最小系统硬件设计正确、开发环境可用、GPIO输出通路正常,可作为后续FOC控制项目的基础平台。