
简介本资源是面向嵌入式初学者与GD32F103ZET6开发板实践者的完整硬件软件学习套件覆盖从原理图理解、外设驱动到综合应用的全链路开发需求。压缩包共791个文件含333个头文件.h定义寄存器与接口、316个源文件.c实现全部14个Demo功能如LED控制、USART双串口通信、I2C EEPROM读写、SPI Flash操作、RTC实时时钟、EXMC扩展NAND Flash与触摸屏、ADC/DAC采集与输出、SDIO SD卡测试、I2S音频播放及USB自定义HID设备另有PDF原理图与硬件用户手册提供底层电路依据以及Keil工程文件.uvproj/.uvopt和启动汇编.s等关键构建要素总大小5.29MB。已有1784人下载学习内容结构清晰、模块独立可复用每个Demo均含完整初始化逻辑与典型应用场景代码如SysTick精准延时、GPIO推挽输出控制LED、USART重定向printf便于快速上手验证与二次开发。 前阵子帮朋友调一块GD32F103ZET6开发板他扔过来的正是这样一个压缩包PDF原理图、硬件用户手册、软件Demo源码。文件名看起来信息量很大但真正解压开后里面没有半句“该从哪看起”。我见过不少人卡在这种资料包上明明三样东西都齐LED就是不亮串口要么没输出要么乱码最后只能把板子扔到一边。这篇文章我就以这套资料包为线索按我实际拿到板子后的顺序把原理图、手册、Demo源码从头到尾捋一遍顺便把从STM32F103“平迁”过来时最容易踩的几个坑也一起说了。1. 拿到资料包先别急着编译下载先把板子的“家底”盘出来1.1 一套典型开发板资料包的三件套这种官方或半官方发布的开发板资料包结构一般都很固定。PDF原理图负责告诉你板子上的每个元件怎么连硬件用户手册负责告诉你跳线帽怎么插、接口怎么用、有哪些注意事项软件Demo源码则是官方工程师验证过的一套最小工程通常包含GPIO点灯、按键检测、串口打印、定时器中断这类基础例程。很多人拿到手之后的习惯是直接打开Demo源码编译、下载、点灯一气呵成。这个流程本身没错但有个前提——你得先确认手里的板子和Demo源码针对的是同一块板子。我见过不止一次板子上的LED接的是PB2例程里却操作PC13板载晶振是25MHz工程里的HSE_VALUE却写的8MHz结果串口乱码点灯倒是能亮因为GPIO不依赖精确时钟。所以第一步不是写代码而是把资料包里的原理图和手册过一遍确认手里是什么板、板上有什么资源、哪些引脚被板载外设占了。1.2 先认识这颗芯片GD32F103ZET6到底是什么GD32F103ZET6是兆易创新GD32F103系列里的一颗高密度型号。内核是Cortex-M3最高主频108MHz内置512KB Flash和96KB SRAM这一点比同级别的STM32F103ZET6要大方一些后者SRAM通常是64KB封装是LQFP144引脚定义和STM32F103ZET6整体兼容。这颗芯片在市场上的定位非常明确在硬件引脚层面兼容ST的STM32F103系列但价格、供货稳定性上有一定优势。所以你在很多工控板、仪器仪表、电机驱动板甚至一些物联网网关上都能看到它的身影。对于学习者来说拿着这块板子做嵌入式入门、做FreeRTOS实验、做电机控制或者简单的数据采集资源都够用而且资料包里的Demo源码是官方固件库风格和STM32标准外设库长得非常像学过的朋友基本能无缝切换。盘完“家底”之后大概就知道自己手里的牌了一块144引脚的Cortex-M3开发板板载若干LED、按键、USB转串口、可能还有SPI Flash、EEPROM、TFT液晶屏接口。接下来就该打开PDF原理图了。2. 原理图PDF不是每根线都要盯先把四棵“树”找齐PDF原理图动辄七八页新手很容易一上来就从第一页第一根线开始读读到最后头晕眼花。我的习惯是跳着看先把四样东西找齐电源树、时钟树、启动配置、下载调试接口。这四样确认了板子的“骨架”就清楚了剩下外设接口部分都是顺着这四条主线往外挂的。2.1 电源树从USB口一路追到芯片内核打开原理图第一页先找电源入口。绝大多数开发板用的是USB供电也就是USB的5V进来经过一颗AMS1117-3.3或者类似LDO稳压成3.3V给芯片和板载外设供电。部分板子会多留一个DC接口或者排针支持外部5V供电这时候你看电源入口处通常会有一个跳线帽或者焊桥用来切换供电来源。看电源树时要特别留意三件事。第一3.3V的输出端有没有足够的去耦电容一般来说靠近芯片电源引脚的位置会放100nF陶瓷电容电源入口处会放一个10uF或22uF的钽电容/电解电容这是判断板子设计是否规范的一个小信号。第二如果板子上同时有3.3V和5V两路电源确认它们之间有没有串接、会不会互相倒灌。第三如果你后面要玩ADC还要注意VREF引脚是直接接3.3V还是通过独立的基准芯片供电这直接决定了ADC采样的精度。我遇到过一块板子3.3V经过一个跳线帽再给到MCU的VDD结果那个跳线帽松了板子“全面断电”查了半天才找到原因。所以拿到手先看原理图里有没有跳线、焊桥在电源通路上心里有数。2.2 时钟树外部晶振的值决定了你后面串口会不会乱码开发板主晶振通常是8MHz连接在OSC_IN和OSC_OUT引脚上旁边有两个20pF左右的负载电容。有些板子为了省成本或为了跑USB会直接用25MHz晶振这并不少见。所以拿到原理图第一件事就是找到这两个脚看清楚晶振标称频率是多少。这个值直接对应工程里的HSE_VALUE宏。GD32官方固件库里这个宏通常定义在gd32f10x.h或者system_gd32f10x.c里默认值是8000000u。如果你的板子是25MHz晶振而宏定义仍旧是8MHz那么系统时钟、串口波特率、定时器时基全都跟着偏表现就是串口打印乱码、延时长度离谱。这不是代码写得不对是时钟基准从一开始就错了。另外注意32.768kHz的RTC低速晶振在原理图上一般很小可能一开始找不到。如果你后面要用RTC提前确认板子上有没有这颗晶振有些精简板子为了省成本没焊RTC就只能靠内部RC振荡器顶着精度差很多。2.3 BOOT启动配置为什么BOOT0默认要拉低GD32F103和STM32F103一样有BOOT0、BOOT1两个引脚用来决定芯片上电后从哪里启动。开发板原理图上BOOT0通常接一个10k下拉电阻到GND少数板子会用一个排针跳线让你选择。BOOT1同理默认也是下拉。BOOT0为低电平时芯片从主Flash启动也就是跑你烧录进去的用户程序。BOOT0为1、BOOT1为0时芯片从System Memory启动运行内置的bootloader配合串口可以把程序下载进去。如果哪天你的程序把引脚复用搞坏了SWD下载不进去就可以把BOOT0拉高让芯片进入系统存储器模式再用串口ISP刷一个干净的固件或者配合工具把Flash擦掉然后再跳回主Flash模式。所以我一直建议玩这种板子动手之前先把BOOT电路在原理图上圈出来。绝大多数开发板出厂时BOOT0已经是拉低状态正常情况不用动但知道它是怎么回事出问题时能救命。2.4 SWD下载接口你往板子上插的第一根线找到原理图上的SWD调试接口一般是一个4针或5针的排针常见网络标签是SWDIO、SWCLK、GND、3V3有些板子会额外引出RESET和SWO。SWDIO对应PA13SWCLK对应PA14这是ARM内核固定的调试引脚别搞反。为什么优先推荐SWD而不是JTAG因为SWD只需要两根信号线加电源地占用的IO少下载速度在实际使用中也足够快大部分DAP-Link都能稳定跑几MHz的时钟。很多开发板出厂默认就只有一个SWD接口所以你看原理图确认一下丝印和顺序就好。下载器的选择上DAP-Link性价比最高十几块到几十块都有免驱或者用WinUSB驱动都行J-Link也可以但要注意别在调试接口上带电插拔我就是插拔太随意烧坏过一个下载器的电平转换芯片后来老老实实养成“先断电、再插线、最后上电”的习惯。2.5 外设接口树LED、按键、串口、液晶屏都挂在哪些引脚上骨架找完之后剩下的都是叶子。LED灯的原理图最简单一个LED串联一个限流电阻另一端接GPIO。你要看的只有两点——接的是哪个引脚以及LED的另一端是接3.3V还是接GND。如果LED一端接GPIO、另一端接3.3V那么GPIO输出低电平时LED才亮这在代码里对应gpio_bit_reset()如果LED另一端接GND那GPIO输出高电平时点亮对应gpio_bit_set()。很多新手第一次点灯不亮不是引脚写错而是电平和板子实际电路反了。按键同理你需要在原理图上确认按键按下时引脚是拉低还是拉高。常见接法是按键一端接GND、另一端接GPIOGPIO内部上拉按下时读到低电平。但也有些板子接法相反按下时读到高电平。串口部分开发板一般会印一个USB转串口芯片最常见的是CH340G。这个芯片的TXD接MCU的PA10USART0_RXRXD接MCU的PA9USART0_TX收发交叉。这一步看清之后后面代码里串口初始化的引脚就锁定了。如果是带TFT液晶屏接口的板子原理图上通常是一片排母连着很多引脚大概率挂在EXMC外部存储器控制器总线上用来模拟FSMC接口驱动液晶屏。这里不用深究每一根线只需要在心里留个印象这个屏占用了很多引脚后面做实验要避开这些引脚用作普通GPIO。3. 硬件用户手册跳线帽和引脚复用表这两块别跳着读PDF原理图看的是“怎么连”硬件用户手册则告诉你“怎么用”。手册一般不长但有几个部分值得专门停下来看尤其是跳线帽和引脚复用表。这两块信息不像原理图那么直观但后期调试时九成问题都出在这上面。3.1 跳线帽一个小塑料块决定整个板子的上电行为硬件手册里通常有一页专门讲跳线设置比如JP1选择USB供电还是外部供电JP2选择BOOT0JP3连接或断开某个外设。这些跳线帽看起来不起眼但影响非常大。我有一次拿到一块板核心板单独供电能正常跑插到底板上就是不行后来翻手册才发现底板上的一个跳线帽默认短接把3.3V和5V之间连到了一起两路电源打架直接把板子搞到异常复位。从那以后我拿到任何板子第一件事就是对照手册把所有跳线的默认状态检查一遍。还有一个常见坑是“用户按键”和“复位按键”在丝印上长得很像。复位按键直接连NRST引脚按下是硬件复位用户按键连的是普通GPIO。如果你在代码里把复位键当成用户键读按下后板子直接重启程序根本跑不到你的按键逻辑。这个用手册上丝印或者原理图都能分辨别只凭感觉。3.2 引脚复用表避免“引脚看起来一样功能却不可用”开发板手册背面的引脚功能表大概是一张很大的表格列出144个引脚中哪些被板载外设占用、哪些引出来可以做实验、哪些只能用特定复用功能。这个表格一定不要跳过。就拿常见的几个引脚来说PA9和PA10通常已经被板载USB转串口占用你在做普通GPIO实验时如果把这俩当成普通IO来推LED会发现怎么配都不对因为它们连着的CH340芯片也在驱动这些引脚。再比如PB3、PB4、PA15这几个引脚默认是JTAG调试功能要做普通GPIO用必须先关闭JTAG复用否则GPIO配了也不受控。这些信息在STM32上同样适用但GD32的例程里往往会给出更明确的演示遇到不听话的引脚先去手册里查复用表。另外引脚表还会告诉你哪些引脚带有5V容忍特性。GD32F103虽然大多数IO是3.3V供电但部分引脚可以承受5V输入这在接5V传感器信号时特别重要。如果手册没写默认就按“所有引脚只接3.3V”来设计别挑战耐压极限。3.3 供电范围和电气特性做产品前必须回来看的一段如果你只是拿开发板点灯玩供电范围和电气特性可以不看但如果你打算用这块板子的原理图为基础去画自己的板子这几张表就得回头仔细读。手册会写清楚GPIO输出高电平的最小值、低电平的最大值、每个引脚灌电流拉电流能力以及绝对最大额定值。比如GPIO总灌电流不能超过多少、芯片工作电压范围是2.6V到3.6V还是2.0V到3.6V这些参数直接影响你的电路设计。比如你做LED限流电阻计算GPIO灌电流能力假设是25mA那LED电流取10mA-20mA都比较安全限流电阻用330Ω到1kΩ都能亮。如果你不查手册直接把LED串一个10Ω接到3.3V上电流可能超到几十毫安虽然LED可能没炸但GPIO长期过载会加速老化甚至烧毁引脚。4. Demo源码从工程结构到第一次点灯照着跑一遍就通资料包里的Demo源码本质是官方工程师验证过的“标准答案”。不要上来就大刀阔斧改代码先原封不动编译一遍烧进去确认板子正常再开始动笔。4.1 先看工程目录再按目录找main函数GD32官方Demo的目录结构一般是这样USER目录放main.c、system_gd32f10x.cSYSTEM目录放延时、串口、中断相关的公共代码HARDWARE目录放各种板载外设驱动CORE目录放启动文件和内核头文件FWLIB目录放GigaDevice的固件库源码。你先找到main.c看看第一个例程做了什么。比如最常见的LED例程main函数里会先调用一个系统时钟配置函数然后在主循环里操作GPIO。GD32固件库的GPIO操作接口跟STM32标准外设库很像但函数名更短例如gpio_init()、gpio_bit_set()、gpio_bit_reset()。如果你以前只写过STM32 HAL库会看到GPIO_InitTypeDef变成了gpio_paras这样的GD32结构体API名也全部小写开头。没事对着例程抄一遍就习惯了。4.2 Keil环境准备器件包、宏定义、Flash算法三件套用Keil打开GD32工程第一件事是确认器件选型。如果Keil里器件列表找不到GD32F103ZE说明你还没安装对应的DFP器件包。到Keil官网或者GigaDevice官方下载GigaDevice.GD32F10x_DFP安装到Keil的Pack目录然后重新打开工程器件列表里就能选GD32F103ZE了。第二件事是确认宏定义。工程配置里通常需要定义GD32F10X_HD这个宏告诉编译器你用的是高密度型号对应的启动文件才会正确初始化中断向量表和内存布局。如果你用的是512KB Flash的ZET6却定义了中密度型号编译能过但引脚中断向量会错位程序跑起来时好时坏。第三件事是Flash下载算法。下载设置里要选GD32对应的Flash算法比如GD32F10x 512KB。如果Keil里找不到这个算法说明DFP装得不完整或者下载器配置选错了芯片型号。这一步卡住了最常见的报错是Error: Flash Download failed或者No Algorithm found解决思路就是先确认器件包安装、再确认算法列表。4.3 点灯例程每个初始化函数在干嘛搞懂才能改首次跑LED例程我建议你逐行读一遍初始化代码不要只按F8编译然后下载。第一步打开GPIO时钟。rcu_periph_clock_enable(RCU_GPIOB)这行就是给GPIOB外设打开时钟使能。在Cortex-M3的MCU上外设时钟默认是关闭的你不开时钟写寄存器等于往墙上扔泥巴没反应。这行代码写对是GPIO能工作的前提。第二步配置引脚模式。gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0)把PB0配置成推挽输出速度50MHz。推挽输出意味着引脚可以主动拉高和拉低驱动LED足够。如果你用的是开漏输出高电平是拉不上去的LED亮度会变暗甚至干脆不亮。第三步用gpio_bit_set()和gpio_bit_reset()控制电平。主循环里点灯、延时、灭灯、再延时循环往复。GD32的延时函数和STM32有点区别官方例程一般会提供基于SysTick的delay_1ms()。如果你把STM32的HAL_Delay直接搬过来多半编译不过因为两个库的函数体系不一样。如果下载完LED不亮我的排查顺序是先用万用表量LED两端电压看有没有电再确认引脚号和板子原理图一致然后回到代码确认点亮电平方向最后检查是不是把板载其他占用引脚当成自由GPIO了。4.4 串口printf重定向调试神器第一次上手就配好点灯通过之后第二个建议跑的例程是串口打印因为后面所有调试都靠它。GD32例程里通常会提供一个usart_init()函数把USART0配置成115200-8-N-1然后通过重定向fputc让printf直接往串口丢数据。这里有个容易踩的坑GD32固件库里的串口编号和STM32不完全一样。在GD32F103的官方代码里你看到USART0对应的是STM32系列里的USART1引脚位置也就是PA9/TX、PA10/RX。很多从STM32转过来的人在代码里拼命找USART1结果在GD32库里根本没这个宏或者找到了但初始化函数一个参数对不上就卡住了。所以建议直接以GD32例程里的注释和引脚定义为准别按STM32的习惯找外设名称。串口接好之后用USB线连接板子电脑装好CH340驱动打开串口助手选对应COM口波特率选115200如果能看到Demo里打印的欢迎信息说明串口链路已经通了后面调试传感器、调试中断、调试实时数据都靠它。5. 从STM32F103“平迁”过来这三个坑我替你踩过资料包里这块GD32F103ZET6硬件引脚和STM32F103ZET6基本兼容很多人就把它当成STM32的“国产平替”直接把手头STM32的HAL库工程拿过来编译下载结果千奇百怪的毛病全出来了。这三个坑我基本都踩过专门列出来供参考。5.1 引脚兼容不等于寄存器完全兼容GD32F103的引脚分布在物理上是兼容STM32F103的但芯片内部的外设寄存器地址空间、位定义、甚至外设数量都有差异。最典型的是串口和定时器GD32里USART和TIMER的排列方式、外部中断线映射、DMA请求号都和STM32不是一一对应。这意味着如果你是用寄存器操作写的STM32代码直接搬到GD32上大概率跑不对。如果你用的是STM32标准外设库SPL或HAL库同样不能直接换芯片编译因为库函数底层操作的寄存器地址不同。正确的做法是使用GD32官方固件库从rcu_periph_clock_enable到gpio_init、usart_init全部用GD32的库函数重新写一遍。好在两套库的编程范式非常接近迁移成本其实没有想象中高。5.2 HSE_VALUE、启动文件、外设命名三个细节最容易忽略从STM32迁移到GD32有三个细节必须同步改。第一是HSE_VALUE刚才已经强调过。如果原工程是针对8MHz晶振的迁移后的目标板如果是25MHz晶振不修改这个宏串口一定乱码延时时长也会差三倍。第二是启动文件。GD32工程的CORE目录下启动文件有多个版本startup_gd32f10x_ld.s对应低密度、startup_gd32f10x_md.s对应中密度、startup_gd32f10x_hd.s对应高密度。ZET6是512KB Flash高密度必须用startup_gd32f10x_hd.s。同理宏定义里的GD32F10X_HD也要对应。第三是外设命名习惯。GD32喜欢用更短的编号比如USART0、TIMER0这种叫法和STM32的USART1、TIM1不完全对应。你在GD32例程里看到TIMER0不要条件是“普通定时器”先查GD32F10x用户手册确定它对应哪个定时器。我的习惯是迁移代码时绝不凭STM32命名习惯猜测GD32外设遇到不认识的编号一律查手册。5.3 串口乱码与下载失败的排查链路如果你迁移后遇到串口乱码我用过的排查路径是固定的先用示波器或万用表看看晶振是否起振起振频率是否和原理图一致然后看HSE_VALUE和系统时钟配置是否匹配接着检查串口初始化里的波特率寄存器配置是否依赖系统时钟值最后才是检查接线和CH340驱动。如果遇到SWD下载失败排查顺序反过来先看目标板供电是否正常再看调试线是否松动然后确认代码里有没有把PA13/PA14复用成普通GPIO。如果程序确实把调试引脚给占了一个救法就是按住板子复位键启动下载瞬间松开复位让内核暂停在启动阶段趁Flash擦除间隙把调试口恢复。这套排查链路不复杂但能解决开发板上绝大多数“玄学”问题。遇到问题不要急着怀疑芯片坏了九成情况是配置和时序的问题。6. 资料包的“二次价值”从跑Demo到做自己能用的板子资料包里的东西表面上只是让你点灯玩但如果你愿意多挖一层它的价值远不止于此。6.1 把PDF原理图变成自己的设计图PDF原理图虽然没有源工程那么方便但信息是完整的。你可以照着它用立创EDA或者Altium Designer重新画一份自己的最小系统板原理图。最小系统其实就那么几件事电源电路、复位电路、BOOT电路、晶振电路、SWD接口、去耦电容。你有官方原理图可以参考等于有人替你验证了一遍哪些器件参数是可行的这个参考价值非常大。我在画自己的GD32板子时基本是照着官方原理图的电源和晶振部分抄的只在接口上做了自己的裁剪。比如不需要USB转串口就把CH340部分去掉需要电池供电就把LDO换成低功耗的LP5907。如果你在立创EDA里画原理图直接把PDF里的网络和封装对照着画就行这个过程中对芯片如何工作的理解会非常清晰。6.2 从Demo扩展成自己的小项目跑通LED和串口之后你想做什么项目无非就是往这条主线上挂外设。比如你手头有一块DHT11温湿度传感器照着资料里的GPIO操作方式写一个单总线协议驱动比如你有OLED屏如果是I2C接口就查一下板子上哪两个引脚挂I2C或者直接用软件模拟I2C再比如你想跑FreeRTOSGD32F103的资源完全够但要注意移植时把系统节拍时钟和GD32的SysTick配置对接上。例程代码可以当“字典”用。遇到不确定的外设用法搜一下官方例程里有没有类似的通常都能找到模板。比如SPI Flash读写例程、ADC连续采样例程、定时器PWM输出例程这些都是官方Demo里常见的模块直接把对应代码抽出来改改参数就能用。6.3 相关资料还能从哪找除了资料包里的东西GD32的官方用户手册GD32F10x User Manual和固件库用户指南是两份绕不开的文档里面把每个外设的寄存器、库函数、示例代码都讲得比较清楚。另外兆易创新官网的“资料下载”页面可以找到勘误表和量产芯片的参考手册不常用但做产品时一定要看。社区里也有很多人在折腾GD32遇到库函数版本不一致、外设命名差异、编译报错这类问题一般搜一下就能找到解决方案。只要把资料包里的三样东西吃透再去读这些资源基本不会再有“不知道从哪看起”的迷茫。我自己在玩这块板子时最大的体会是开发板资料包不像教科书它更像一张藏宝图关键信息散落在原理图、手册和代码里需要你自己动手把它们串起来。串起来之后你会发现GD32F103ZET6并不神秘它就是一颗性能不错、资源丰富的Cortex-M3芯片而你已经知道从哪里下手让它干活了。本文还有配套的精品资源点击获取