ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

告别Keil!用SEGGER Embedded Studio开发GD32全攻略

2026/9/25 5:00:07 拓冰建站 浏览量
告别Keil!用SEGGER Embedded Studio开发GD32全攻略 1. 为什么我最终选了SEGGER Embedded Studio来开发GD321.1 从一次“点灯翻车”说起刚接触GD32那会儿我跟大多数人一样第一反应是装Keil。毕竟学校里、教程里、师兄传下来的工程模板里清一色都是Keil的.uvprojx文件。结果呢装完MDK兴冲冲打开一个GD32F103的例程编译——报错找不到器件包。去官网下载GigaDevice的Device Family Pack装完再编译又提示Flash算法不匹配。折腾了一下午灯没亮心态先崩了。后来我换了个思路既然GD32和STM32在寄存器层面高度兼容那我能不能用一套更现代、跨平台、对个人开发者更友好的工具链于是我把目光投向了SEGGER Embedded Studio后面简称SES。SES是SEGGER公司推出的商用级IDE对非商业用途免费内置GCC编译器、调试器、RTOS感知调试而且原生支持J-Link。最关键的一点它不需要你满世界找器件包新建工程时选好内核架构剩下的交给它。这篇文章就是把我从零搭建GD32开发环境的完整过程记录下来。包括SES的安装、GD32支持包的配置、J-Link调试器的连接、新建工程、编写代码、编译下载、直到LED闪烁的每一个环节。中间踩过的坑、绕过的弯路、以及那些“早知道就好了”的细节我都会毫无保留地写出来。无论你是刚入门的电子专业学生还是从STM32转过来的老手只要你想用SES开发GD32这篇内容都能直接抄作业。1.2 SES相比Keil和IAR的取舍逻辑先说说为什么我不推荐一上来就用Keil。Keil MDK确实是国内嵌入式教学的“事实标准”但它的授权费用对个人开发者不友好而且界面和工具链停留在十年前的水平。IAR同理编译效率高但价格劝退。SES的定位很巧妙非商业用途免费商业用途才需要付费。对于学习、评估、个人项目来说这个授权模式几乎没有门槛。从技术角度看SES有几个让我无法拒绝的点。第一它内置了SEGGER GCC编译器不需要你单独安装ARM GCC工具链省去了配置环境变量的麻烦。第二它的工程文件格式是XML可读性好方便版本管理不像Keil的二进制工程文件那样难以diff。第三J-Link调试体验是SEGGER自家产品配合SES使用几乎是零配置。第四SES支持多平台Windows、Linux、macOS都能跑这对习惯在Linux下开发的工程师来说很关键。当然SES也不是没有缺点。它的中文资料相对少遇到问题需要翻英文论坛。另外GD32的官方支持包在SES里不是默认集成的需要手动添加。但这些问题都有成熟的解决方案后面我会一步步说明。1.3 适用人群与前置知识这篇文章适合以下几类人一是刚学完C语言、准备上手单片机的学生二是用惯了Keil、想换一套更现代工具链的工程师三是需要在Linux或macOS下开发GD32的开发者。前置知识方面你只需要会基本的C语言语法了解什么是GPIO、什么是寄存器就够了。不需要你懂Makefile不需要你懂链接脚本SES会帮你处理这些底层细节。如果你连GD32是什么都还不清楚简单说它是国内厂商推出的一系列基于ARM Cortex-M内核的微控制器引脚和寄存器设计与STM32高度兼容但价格更有优势供货也更稳定。常见的型号有GD32F103、GD32F303、GD32F450等分别对应STM32的F1、F3、F4系列。点灯是嵌入式开发的“Hello World”我们就从它开始。2. 安装SES与GD32支持包的完整操作2.1 SES下载与安装的细节陷阱打开SEGGER官网找到Embedded Studio的下载页面。这里要注意SES有多个版本建议下载最新稳定版不要选Beta版。下载时会让你填邮箱和用途如实填写即可非商业用途选择“Non-Commercial”就行。安装包不大Windows版大概200MB左右。安装过程中有几个选项需要留意。第一安装路径不要包含中文和空格这是嵌入式工具链的通病路径里有中文可能导致编译器找不到文件。我一般直接装在C:\SEGGER\SEGGER Embedded Studio下。第二安装程序会问你是否安装J-Link驱动如果你手头有J-Link调试器一定要勾选。第三它会问是否关联.emProject文件建议勾选方便双击打开工程。安装完成后第一次启动SES会弹出许可证选择窗口。选择“Activate Your Free Non-Commercial License”然后填写基本信息它会通过邮件发给你一个激活码。整个过程大概两分钟。如果你是企业用户需要购买商业License这里就不展开了。注意SES的免费License仅限非商业用途如果你在公司用它开发商业产品请务必购买正版授权。这不是技术问题是合规问题。2.2 添加GD32器件支持包SES默认的器件列表里没有GD32需要手动添加。方法有两种一种是通过SES的Package Manager在线安装另一种是手动导入GigaDevice的Device Family Pack。我推荐第一种更简单。具体操作打开SES点击菜单栏的Tools-Package Manager。在弹出的窗口中找到GigaDevice分类展开后你会看到GD32F1xx、GD32F3xx、GD32F4xx等系列。勾选你需要的系列点击Install。SES会自动从SEGGER的服务器下载并安装。这个过程需要联网如果网络不稳定可以多试几次。如果你用的是离线环境或者Package Manager里找不到对应型号那就需要手动导入。去GigaDevice官网下载对应的DFP包文件后缀是.pack然后在Package Manager里点击Import选择下载好的文件即可。手动导入的包可能不包含SES的工程模板但器件定义和Flash算法是齐全的不影响使用。安装完成后你可以在Package Manager的Installed标签页里看到已安装的GD32系列。这时候新建工程时就能在器件列表里搜索到GD32了。2.3 J-Link驱动与硬件连接确认如果你用的是J-Link调试器SES安装时已经装了驱动。但如果你用的是J-Link OB板载调试器或者第三方的DAPLink情况会复杂一些。J-Link OB通常需要额外的驱动配置而DAPLink在SES里需要安装额外的插件。为了减少变量我建议初学者直接买一个正版J-Link EDU或者J-Link OB省去驱动折腾的时间。硬件连接方面GD32的最小系统板通常引出SWD接口SWDIO、SWCLK、GND、VCC。J-Link的20针接口里第7针是SWDIO第9针是SWCLK第4针和第6针是GND第1针是VCC参考电压。如果你用的是简化版的J-Link只有四根线那就按丝印对应连接。连接前务必确认目标板的供电电压J-Link的参考电压要跟目标板一致否则可能烧毁调试器。上电后打开SES点击Target-Connect J-Link。如果连接成功底部的调试终端会显示J-Link的固件版本和目标芯片的ID。如果提示“Cannot connect to target”先检查接线再检查目标板是否上电最后检查J-Link驱动是否正常。3. 新建GD32工程与点灯代码实现3.1 从零新建一个GD32工程打开SES点击File-New Project。在弹出的向导里选择C/C-Executable然后点击Next。接下来是关键步骤在Target选项卡里选择ARM作为架构然后在Device搜索框里输入GD32。如果你之前装好了支持包这里会列出所有可用的GD32型号。我以GD32F103C8为例选中它点击Next。下一步是选择调试接口。默认是J-Link保持不动。然后是Project Name和Location自己起个名字路径同样不要有中文。点击FinishSES会自动生成一个包含启动文件、链接脚本、系统初始化代码的完整工程。这时候你会在左侧的项目浏览器里看到几个文件夹Source Files、Include Files、System Files。System Files里包含了GD32的启动汇编文件和系统时钟配置。SES已经帮你把最基础的部分搭好了你只需要在main.c里写业务代码。提示SES生成的工程默认使用SEGGER GCC编译器优化等级是-O2。如果你在调试时发现变量被优化掉可以在Project-Options-Code Generation里把优化等级改成-O0。3.2 理解GD32的GPIO寄存器操作在写点灯代码之前有必要简单说一下GD32的GPIO控制原理。GD32F103的GPIO外设挂载在APB2总线上使用前需要先使能时钟。每个GPIO端口有多个寄存器CTL0控制寄存器0、CTL1控制寄存器1、ISTAT输入状态、OCTL输出控制、BOP位操作寄存器、BC位清除寄存器。以PA0为例要让PA0输出高电平需要第一步使能GPIOA的时钟通过RCU_APB2EN寄存器的PAEN位第二步配置CTL0寄存器把PA0对应的4个bit设为0b0010推挽输出最大速度2MHz第三步通过BOP寄存器的BOP0位写1让PA0输出高电平。如果你觉得直接操作寄存器太底层也可以用GigaDevice提供的标准外设库。但SES新建的工程默认不包含标准库需要手动添加。为了保持工程简洁我在这里直接用寄存器操作代码量不大而且能帮你理解底层原理。3.3 完整的点灯代码与编译下载在main.c里写入以下代码#include gd32f10x.h void delay(volatile uint32_t count) { while (count--) { __asm__ volatile (nop); } } int main(void) { /* 使能GPIOA时钟 */ RCU_APB2EN | (1 2); /* 配置PA0为推挽输出速度2MHz */ GPIOA_CTL0 ~(0xF 0); GPIOA_CTL0 | (0x2 0); while (1) { /* PA0输出高电平 */ GPIOA_BOP (1 0); delay(500000); /* PA0输出低电平 */ GPIOA_BC (1 0); delay(500000); } }这段代码的逻辑很直白先开时钟再配引脚然后在一个死循环里翻转电平。delay函数用了一个简单的空循环实际项目中你应该用SysTick或者定时器来做精确延时。写完代码后点击Build-Build Solution。如果一切正常底部的输出窗口会显示编译成功生成了.elf和.hex文件。然后点击Target-DownloadSES会通过J-Link把程序烧录到GD32的Flash里。烧录完成后点击Target-Start Debugging程序会停在main函数的第一行。按F5全速运行你应该能看到连接在PA0上的LED开始闪烁。注意GD32F103的Flash起始地址是0x08000000SES生成的链接脚本已经配置好了。如果你用的是GD32F303或F450Flash地址可能不同需要检查链接脚本里的ROM区域定义。4. 常见问题排查与独家避坑经验4.1 编译报错“cannot find -lxxx”怎么办这是SES新手最常见的问题之一。报错信息通常是cannot find -lGD32F10x或者类似的库文件缺失。原因是你没有把对应的库文件路径添加到工程里。解决方法右键点击工程选择Options在Linker-Library里添加库文件路径。如果你用的是标准外设库还需要在Preprocessor里添加对应的宏定义比如GD32F10X_MD。另一个常见原因是启动文件选错了。GD32F103C8是中等容量产品启动文件应该用startup_gd32f10x_md.s。如果你选了hd大容量或ld小容量编译可能通过但运行会出错。SES新建工程时如果选对了器件型号它会自动匹配启动文件但手动导入工程时容易搞错。4.2 J-Link连接失败的五种排查思路J-Link连不上目标板我总结了一个排查顺序按这个顺序走90%的问题都能解决。排查步骤检查内容常见问题1目标板是否上电电源指示灯不亮2SWD接线是否正确SWDIO和SWCLK接反3J-Link驱动是否安装设备管理器有黄色感叹号4目标芯片是否被锁读保护导致无法连接5复位方式是否匹配需要选择“Connect under reset”其中“芯片被锁”是GD32用户经常遇到的坑。如果你之前烧录的程序里开启了读保护J-Link会连不上。解决方法是用J-Link Commander执行unlock命令或者通过BOOT0引脚进入系统存储器启动模式用串口擦除芯片。GD32的解锁方法和STM32类似但细节有差异建议查一下对应型号的参考手册。4.3 点灯不亮的软件排查清单代码编译通过了下载也成功了但LED就是不亮。这时候先别怀疑硬件按下面的清单过一遍。第一确认LED的极性。有些开发板的LED是阳极接VCC、阴极接GPIO这时候GPIO输出低电平才亮。如果你代码里写的是输出高电平灯自然不亮。第二确认引脚编号。PA0对应的是GPIOA的第0脚但有些板子的丝印标的是“PA0”却连到了别的引脚用万用表量一下最稳妥。第三确认时钟使能位。GD32F103的GPIOA时钟使能位在RCU_APB2EN的第2位但不同系列的位定义可能不同查一下头文件里的宏定义。第四确认延时时间。如果延时太短比如只有几十个时钟周期肉眼根本看不出闪烁用示波器或者逻辑分析仪抓一下波形。4.4 那些教程里不会写的实操心得第一个心得SES的工程文件要定期备份。SES的.emProject文件是XML格式虽然可读但有时候会因为意外关闭而损坏。我习惯用Git管理工程每次改完代码就commit一次这样即使工程文件坏了也能回滚。第二个心得善用SES的“Live Watch”功能。在调试模式下Debug-Live Watch可以实时查看变量的值不需要暂停程序。这对于调试状态机或者通信协议特别有用。Keil也有类似功能但SES的响应速度更快。第三个心得GD32的Flash算法要选对。SES的Package Manager里GD32F1xx系列的Flash算法有好几个版本对应不同的Flash容量。如果你选错了下载时会提示“Flash download failed”。GD32F103C8的Flash是64KB选GD32F10x_MD对应的算法就对了。第四个心得不要迷信“一键新建工程”。SES的工程向导虽然方便但生成的工程里包含了很多你用不到的库文件。我建议在熟悉流程之后自己手动创建一个最小工程只保留启动文件、链接脚本和必要的头文件。这样编译速度更快代码也更可控。5. 从点灯延伸到实际项目的工程化建议5.1 把点灯工程改造成标准工程模板点灯只是验证环境是否搭好真正做项目时你需要一个更规范的工程结构。我的习惯是建三个文件夹CMSIS放内核相关的头文件和启动文件Library放GD32的标准外设库User放自己的业务代码。然后在SES里配置好头文件搜索路径这样换一个GD32型号时只需要替换CMSIS和Library里的文件User里的代码基本不用动。另外建议在工程里加入SysTick配置用系统滴答定时器做一个毫秒级的延时函数。空循环延时在不同优化等级下表现不一致-O2时可能被优化掉-O0时又太慢。用SysTick既准确又通用是实际项目的标配。5.2 版本管理与团队协作的注意事项SES的工程文件是XML这意味着你可以用Git做版本管理而且能清楚地看到每次修改了哪些配置。但要注意SES会在工程目录下生成.build、.settings等临时文件夹这些不应该提交到Git。建议在.gitignore里加上这些目录。团队协作时每个人的SES安装路径可能不同工程文件里的绝对路径会导致别人打开时报错。解决方法是在SES的Options-Project-Paths里使用相对路径或者用$(ProjectDir)这样的变量。SES支持路径变量配置一次就能跨平台使用。5.3 后续学习路径与资源推荐环境搭好、点灯成功之后下一步就是学习GD32的外设驱动。建议从串口USART开始因为串口是调试信息输出的主要通道。然后是定时器TIMER用来做PWM输出或者输入捕获。再往后是SPI、I2C、ADC、DMA这些外设在GD32和STM32上的操作逻辑基本一致你可以直接参考STM32的教程但要注意GD32的寄存器命名和库函数名称有细微差别。资源方面GigaDevice官网提供了每个型号的固件库和例程虽然代码风格比较老旧但功能是完整的。SEGGER的官方文档和论坛是解决SES问题的首选英文内容为主但质量很高。另外GitHub上有很多开源的GD32工程模板搜GD32 SES或者GD32 GCC就能找到可以直接拿来参考。我个人在实际操作中的体会是嵌入式开发环境搭建这件事第一次做总是最痛苦的因为变量太多——工具链版本、驱动版本、硬件连接、芯片状态任何一个环节出问题都会导致失败。但一旦你成功跑通一次后面再搭类似的环境就是十分钟的事。所以遇到问题不要慌按排查清单一步步来实在不行就换一个最简单的工程重新开始。环境搭好了剩下的就是写代码的事了。