手把手教你用FMD-Link给辉芒微MCU烧程序:从Hex生成到成功校验的完整避坑指南
如果你是从STM32、GD32这类芯片转过来玩辉芒微MCU的,多半会遇到一个挺尴尬的场面:板子画好了,代码编译通过了,结果发现手里的J-Link压根用不上——辉芒微的FT32F系列或者其他8位MCU,官方推荐的调试/烧录方案是FMD-Link,配合官方的ProWrite编程软件来用。我第一次拿到FMD-Link的时候,也想着“不就是个烧录器嘛,插上就能用”,结果先是驱动识别不了,再是Hex文件加载进去地址对不上,最后烧录成功但校验失败,折腾了一晚上才搞明白问题出在供电不稳上。
这篇文章把我从Hex生成到最终校验通过这条完整链路里踩过的坑、用过的工具、以及排查问题的思路全部捋一遍,适合刚接触辉芒微MCU、准备用FMD-Link烧第一批样板的工程师,也适合那些在烧录环节反复出问题、想系统搞明白原理的朋友。
1. 为什么辉芒微的板子不能用J-Link顺手烧:FMD-Link的定位与选型
1.1 从STM32/GD32转过来最容易踩的认知差
很多人第一次听到“辉芒微MCU的烧录要用FMD-Link”,第一反应是:不都是ARM Cortex-M0+吗,SWD协议是公开的,J-Link理论上也能连啊?
理论上是这样,但实际上有两个坎。第一,辉芒微的FT32F系列虽然内核是ARM Cortex-M0+,SWD接口也确实存在,但官方下载算法和调试支持是围绕自家工具链做的,J-Link的驱动库和Flash算法里可能没有对应芯片的型号描述,你插上去之后J-Link软件根本认不出目标芯片。第二,辉芒微还有一大票8位MCU(FT61F系列等),这部分根本就不是ARM内核,J-Link完全不支持,只能走官方烧录器方案。
所以别在这上面浪费时间,老老实实按官方路线走。FMD-Link就是辉芒微官方给出的统一调试/烧录解决方案,类似ST-Link之于STM32,它既能配合IDE做在线调试,也能配合ProWrite编程软件做离线烧录和校验。
1.2 FMD-Link的硬件形态和配套工具
FMD-Link本体是一个小小的调试器,一头是USB接到电脑,另一头是目标板排针接口。不同批次的产品外观略有差异,但接口定义基本一致,通常引出VDD、GND、SWDIO、SWCLK这几个信号,部分型号还会引出RST和额外的IO口。
配套软件方面,烧录用的是辉芒微官方的ProWrite编程软件,在线调试则是在FMD IDE或者Keil里选择对应的调试器驱动。这里有个容易忽略的点:ProWrite和IDE调试器的驱动是两套东西,装完ProWrite之后,Keil里能不能直接选FMD-Link取决于你装没装对应的DAP调试驱动。我第一次就是只装了ProWrite,然后跑到Keil里找FMD-Link选项,找了半天没找到,后来才发现还要单独装驱动包。
1.3 不同烧录方式怎么选
辉芒微MCU的烧录方案不止FMD-Link一种,实际项目里要按开发阶段和量产规模来选,我直接整理成表格方便对照:
| 烧录方式 | 工具/硬件 | 适用阶段 | 优点 | 注意点 |
|---|---|---|---|---|
| FMD-Link | FMD-Link硬件 + ProWrite软件 | 开发调试、小批量样板烧录 | 支持在线调试,烧录+校验一体,速度快 | 需要单独购买硬件,驱动安装略繁琐 |
| 串口ISP | USB转TTL模块 | 支持ISP功能的型号(部分8位MCU) | 成本低,手头随便一个串口模块就能烧 | 需要按芯片手册接BOOT/复位时序,速度偏慢 |
| 第三方量产烧录器 | 如辉芒微授权的离线烧录器 | 中大批量生产 | 无需电脑,支持一拖多,适合产线 | 需要额外购置设备,配置流程要提前培训 |
| 产线治具 + FMD-Link | 定制烧录治具 | 半自动产线 | 复用官方工具,稳定可控 | 治具开发有成本 |
我的建议很简单:开发阶段和打样阶段直接用FMD-Link,等产品定型、准备批量生产了再评估要不要上离线烧录器。一开始就追求“一步到位”买离线烧录器,配置芯片型号、烧录位、校验策略这些环节反而容易把人绕晕。
2. 从工程编译到Hex文件:别等烧录时才找不到镜像
2.1 在Keil、FMD IDE、MPLAB里开启Hex输出
烧录的前提是手里有一份正确的Hex文件。很多新手卡在第一步:代码编译全过,但文件夹里找不到.hex,只能看到一个.axf或者.o文件。原因很简单——编译器默认不输出Hex,需要手动打开选项。
如果你用的是Keil MDK,操作路径是:魔术棒(Options for Target)→ Output选项卡 → 勾选“Create HEX File”。这一步做完,重新编译,Hex文件会输出到Output文件夹里,文件名和工程名一致。
如果你用的是辉芒微官方的FMD IDE(基于Eclipse/GCC),Hex输出通常在编译配置里设置,或者在Makefile里加objcopy命令生成。还有一种常见情况:有些老工程师习惯了Microchip的MPLAB IDE,辉芒微部分8位MCU的开发环境确实长得跟MPLAB很像,这时候生成Hex的入口在Project Properties里,找到“Linker”或者“Output”相关设置,把输出格式改成Intel HEX。
2.2 Intel Hex格式扫盲:地址、数据、校验和怎么读
Hex文件本质是文本文件,每一行都遵循Intel HEX格式规范。以典型的行举例:
:10010000214601360121470136007EFE09D2190140从左往右拆:
- 冒号:行起始标志,固定不变
- 10:本行数据区长度为16个字节(十进制也是16)
- 0100:本行数据要写入的起始地址偏移,这里是0x0100
- 00:记录类型,00表示数据记录
- 之后32个字符:16字节的实际数据
- 40:校验和,用于保证这一行数据在传输过程中没被改坏
校验和的计算规则是:把长度、地址、记录类型、数据所有字节相加,取低8位,再用0x100减去这个值。举个例子,前面那些字节加起来的低8位是0xC0,那么校验和就是0x100 - 0xC0 = 0x40,也就是行尾的40。这个规则自己手动算一遍就彻底懂了,不需要死记。
Hex文件里除了00数据记录,还会出现01(文件结束)、02/04(扩展地址)等记录类型。比如地址超过64KB的时候,需要用04记录来指定高16位地址,这就是为什么有些Hex文件开头会出现:020000040000FA这类行——它是在告诉烧录器:“后面的数据往0x0000xxxx这个高地址段写”。
2.3 编译没问题却没有Hex的常见原因
除了忘记勾选“Create HEX File”这个最蠢也最常见的原因,还有几个隐蔽情况值得注意。
一是编译生成了Hex,但输出路径不在顶层文件夹。Keil的默认输出目录是工程目录下的Output文件夹,有些人用IDE自带的文件搜索功能搜.hex搜不到,其实是搜索范围没覆盖到。二是因为编译优化或者链接脚本的问题,生成的Hex文件是空的,文件大小只有几十字节,加载进ProWrite后芯片地址空间一片空白。三是有时候工程里同时存在多个target配置,你编译的是Debug target,但Hex输出只在Release target里勾选了,两者不同步。
2.4 Hex转BIN/十进制:什么时候用、怎么做
烧录辉芒微MCU通常直接用Hex就够了,但偶尔也会碰到需要转格式的场景:调试Bootloader时需要给上位机提供BIN文件,或者做CRC校验时需要把Hex里的数据提取出来算一个整体校验值。
Hex转BIN,最推荐的方式是装Python后跑一个IntelHex库脚本,两行代码的事:
from intelhex import IntelHex ih = IntelHex("firmware.hex") ih.tobinfile("firmware.bin")如果你只是临时想要某一行的十进制数据来做核对,手头没有Python环境,也可以用在线Hex工具,把整行粘贴进去选“ASCII转HEX/HEX转DEC”就能出结果。但注意:在线工具适合核对单行数据,不适合做整个固件的转换,涉及地址偏移和扩展地址处理时容易出错。
3. FMD-Link实操记录:接线、驱动、烧录界面逐项配置
3.1 驱动安装后设备管理器里应该长什么样
这一步在Windows系统上最容易出问题。我的建议顺序是:先插上FMD-Link,等系统自动搜索驱动失败后,再打开设备管理器看有没有带黄色感叹号的未知设备,然后手动安装驱动。
装完官方驱动后,正常情况下设备管理器里会出现一个类似“FMD-Link”或者“CMSIS-DAP”字样的设备,有些版本会出现在“通用串行总线设备”下面。这里有个判断技巧:如果你在设备管理器里看到的是COM口编号的串口设备,那说明你插的是虚拟串口模式的FMD-Link,这种模式可以用来做ISP烧录,但如果你接的是SWD模式的FT32F系列芯片,就得确认目标芯片支持串口ISP,否则烧录会频繁失败。我第一次就没分清,对着FT32F370用串口模式烧了半天,一直报连接超时,后来切到CMSIS-DAP模式才正常。
提示:驱动安装完成后,如果拔插过FMD-Link或者换了USB口,最好到设备管理器里确认一次设备还在。Windows的多USB口供电能力不同,优先插主机后置USB口,不要用HUB和前置面板。
3.2 接线规范:VDD/GND/SWDIO/SWCLK的顺序和供电
FMD-Link和目标板之间的接线看起来简单,实际上是烧录不稳定的第一大来源。标准接法如下:
- VDD接目标板的3.3V电源
- GND接目标板的GND
- SWDIO接芯片的SWDIO引脚
- SWCLK接芯片的SWCLK引脚
关键细节在于供电策略。FMD-Link的VDD引脚有电压检测功能,它通过读取VDD的电压来判断目标芯片的工作电压,从而决定SWDIO和SWCLK的电平标准。所以哪怕目标板已经独立供电了,VDD线依然要接,否则烧录器识别不到正确的目标电压,默认电平可能不匹配,导致通信不稳定。
我踩过的坑是这样的:样板是从USB取电的,外部电源线就接了GND,没接VDD,结果烧录器能识别芯片ID但烧录到一半就报校验错误。后来把VDD线也接上,问题立刻消失。如果你的目标板由外部稳压器供电,也要记得把稳压器输出的3.3V和FMD-Link的VDD连在一起,保持共地共电平。
3.3 烧录软件里的关键配置项
打开ProWrite,主界面会比较直观地分成几个区域:芯片型号选择、烧录文件加载区、操作按钮区和日志输出区。对着这几个区逐项确认:
- 芯片型号:必须和你实际使用的型号完全一致,比如FT32F030F6A和FT32F030F8A虽然同为FT32F030系列,但Flash大小不同,选错型号轻则烧录失败,重则把邻区的程序覆盖掉。
- 接口模式:根据接线方式选SWD还是ISP。
- 烧录文件:加载前面生成的Hex文件,确认加载后的起始地址和文件大小符合预期。
- 选项字节(Option Byte):这是辉芒微MCU比较特别的一环,比如看门狗使能、复位引脚功能、硬件I2C引脚映射等,都在这里配置。这个区域的配置会跟Flash数据一起烧进去,不是独立的EEPROM数据。
3.4 一个完整的烧录+校验操作序列
配置完成后,完整的烧录操作序列是这样的:
- 先点“连接”或者“检测”按钮,确认软件能读到目标芯片的ID,这一步相当于“握手”。
- 加载Hex文件,观察加载日志里显示的芯片占用空间,比如“Data: 8.2KB / 32KB”,确认没超容量。
- 配置选项字节,确认每个开关的状态是你想要的。
- 点击“烧录”,软件会依次执行擦除(Erase)、写入(Program)、校验(Verify)三步,日志区会滚动显示每一步的状态。
- 烧录完成后,别急着拔线,先点一下“校验”或者“读回”,让软件把芯片里的数据和Hex文件做一次全量比对。
在上面第4步中,如果你的操作序列里没有自动校验环节,一定手动补上。擦除为什么必要?因为Flash只能从1写成0,写入前必须先把整片擦回0xFF,否则旧数据和旧数据之间会出现“叠写”错误。
4. 校验不等于“烧完能跑”:三种校验方式的原理与用途
4.1 烧录器内置校验到底做了什么
ProWrite自带的校验,本质上是从芯片里把Flash内容逐字节读回来,和烧录用的Hex文件做对比。这里有个细节:它对比的是整片烧录地址区域,不光是应用数据本身。所以如果你在选项字节里配置了某些特殊功能,而这些功能没有体现在Hex文件里,内置校验可能会把这一部分单独处理,不会报错,但也意味着这一部分不会被校验覆盖。
4.2 CRC、校验和、MD5:概念区分和适用场景
烧录校验这件事,在项目里经常和“CRC校验”“校验和”“MD5”这几个词混在一起,我梳理一下它们的关系:
- 校验和(Checksum):最简单的累加校验,把数据按字节相加取低8位或者16位。Hex文件每一行行尾的校验和就是典型例子。优点是计算快,缺点是检错能力弱,两个字节互换位置这种错误它检不出来。
- CRC校验:循环冗余校验,它能检出的错误类型比校验和多,CRC16/CRC32被广泛用在Modbus通信、存储校验、固件包等场景。CRC不是简单累加,而是对数据做多项式除法运算,基本原理类似“用除数去模数据流,余数就是校验码”。
- MD5:一种哈希算法,把任意长度的数据算成固定128位摘要。它和CRC/校验和的本质区别是,它不针对错误检测设计,而是用来验证“文件是否一模一样”,比如从服务器下载固件后算MD5和官方发布值对比。
烧录场景下的建议:
- FMD-Link内置校验能过,说明Flash里的内容和Hex一致,这是第一道保障;
- 如果固件需要在运行时做自检,比如Bootloader检查App区是否有效,那就在App里实现CRC32计算,启动时把整个App区的CRC算一遍和末尾存放的期望值比较;
- 如果需要确认产线上烧录的文件版本没问题,用MD5工具在PC端对比Hex文件就行;
- 千万别用简单校验和来判断整个固件的完整性,错误漏检率让人心里没底。
4.3 手动回读对比Hex文件的做法
如果烧录器的内置校验因为某些原因没法做完整对比,可以手动回读。操作方法是:在ProWrite里点“读回”(Read Back),选好读出长度(一般是整片Flash容量),软件会把目标芯片里的内容读出来保存为一个Hex文件。
然后把这个“读回的Hex”和“原始烧录的Hex”做对比。快速做法是在命令行里用:
md5sum original.hex readback.hex两条MD5一致,基本可以断定映像完全一致。不一致的话,再用文件对比工具定位到底是哪个地址区间的数据对不上,方便缩小排查范围。
4.4 选项字节和配置位为什么也要校验
辉芒微MCU经常有通过选项字节配置的功能,例如内部RC频率校准、LVR低压复位阈值、IO驱动能力等。这类配置如果烧错了,程序一样能跑,但可能在某种电压、温度条件下出现诡异的问题。
所以严谨的做法是:把选项字节的期望值记到项目文档里,烧录完成后回读或核对ProWrite日志中的选项字节状态,确保实际烧进去的和设计值一致。这个习惯能在后期省掉很多“程序看着没问题但板子行为不对”的排查时间。
5. 避坑实录:从Hex加载到校验失败的完整排查链路
5.1 坑一:Hex加载后地址错乱
我在帮朋友烧一片FT32F030时碰到过,Hex文件加载后,软件界面上显示的起始地址不是0x0000,而是一个很奇怪的高地址段。一开始以为是软件读错了,后来检查Hex文件内容才发现,这个工程是复制过来的,复制的时候链接脚本没有一起更新,一直沿用旧工程的Flash分配,导致代码被链接到了错误地址区间。
遇到加载后地址异常,先看Hex文件本身:用记事本打开,检查第一个数据记录行的地址是多少,再和芯片的Flash起始地址对比。如果两者不匹配,说明工程链接配置有问题,回到IDE里检查链接脚本里的Flash基地址。
5.2 坑二:提示烧录成功但校验不过
烧录时显示写入成功,紧接着校验就报错,这种现象最常见的三个原因:供电不稳、接线过长、目标芯片在烧录过程中被外部电路干扰。
供电不稳的判断方法是:烧录过程中用万用表或示波器观察VDD引脚电压,如果在写入瞬间电压跌落超过100mV,基本可以确定是电源问题。我遇到过一种情况是目标板上有一个大电容,上电瞬间充电电流很大,USB供电扛不住,导致烧录器瞬间失去电压参考,写进去的部分数据就错乱了。解决办法很简单,给目标板换一个独立稳压电源,或者用短粗线连接外部3.3V。
接线过长的问题也比较常见,SWCLK频率高,如果杜邦线超过20厘米,信号反射和干扰会明显增加。对策是降低CLK频率(ProWrite里可以调),或者换成屏蔽线/排线,尽量缩短距离。
5.3 坑三:FMD-Link连接不上目标芯片
连接不上的排查链路比较固定,按顺序来:
- 检查设备管理器里的FMD-Link设备是否正常,不正常就重新插拔或重装驱动;
- 用万用表量一下目标板的VDD、GND、SWDIO、SWCLK四根线和FMD-Link对应引脚是否导通;
- 检查目标板是否在正常工作电压范围内,如果目标板本身没上电或者复位脚一直被拉低,SWD也连不上;
- 确认芯片是不是被之前的烧录程序把调试端口复用了。有些代码会把SWD引脚配置成普通GPIO,导致下次无法连接,这种情况要用“连接前手动进Bootloader”或者按住复位键再点连接的方式恢复。
最后一种情况最容易让人崩溃,按复位键再点连接这个操作,我做了一百次之后才形成肌肉记忆。它的原理是:芯片复位后,SWD引脚在短暂窗口期处于默认调试功能,烧录器在这个窗口内抢占连接就能成功。
5.4 坑四:外部校验工具和烧录软件结果对不上
有段时间我写了个脚本计算固件文件的CRC32,用于Bootloader在运行时校验App区,算出来的值和烧录时软件显示的不一样。折腾半天才发现,烧录软件校验的是整片Flash区间(包括未使用的0xFF填充区),而我脚本里算的是Hex文件里实际存在的有效数据区间。两边口径不同,结果自然不同。
遇到这种情况,先明确一个核心问题:你校验的目的是什么?如果是为了确认“烧进去的和原文件一致”,那用烧录软件的整片对比就够了。如果是为了“运行时可检查固件完整性”,那CRC的计算范围必须和Bootloader检查的范围一致,这个范围建议单独定义一个宏,别靠人肉记。
5.5 排查路线图:按硬件、文件、软件三线定位
把上面所有问题收敛一下,我在实际项目中总结出一套排查顺序:
| 排查类别 | 检查内容 | 快速判断方法 |
|---|---|---|
| 硬件链路 | 供电电压、接线通断、CLK频率、线长 | 万用表测VDD/GND,示波器看烧录瞬间电压跌落 |
| 文件内容 | Hex地址区间、文件格式、芯片型号匹配 | 记事本查看Hex,对比芯片Flash起始地址和容量 |
| 软件配置 | 接口模式、选项字节、驱动状态 | 设备管理器看FMD-Link,ProWrite连接日志看提示语 |
这套顺序的依据是成本从低到高:谁先被排除,后面就越省事。新手容易一上来就怀疑软件配置,其实硬件问题往往占大头,尤其是供电和接线。
6. 批量烧录场景的补充建议
6.1 一拖多和流水线操作
样板烧录没什么压力,但一旦进入小批量生产,比如一次烧50片、100片,逐片开电脑烧就太慢了。如果手头只有一套FMD-Link,建议提高效率的办法是:把烧录参数配置保存成工程文件,每次打开ProWrite直接加载配置,避免反复选型号和配置选项字节。
如果产量再往上走,可以评估一台电脑挂多个FMD-Link的方式,ProWrite支持多实例同时烧录。量产前最好做一次烧录时间测试,一片芯片从擦除到写入到校验全部跑完需要多少秒,乘以产量,就能算出需要几套烧录器才能在规定时间内完成交付。
6.2 出问题后怎么复现
批量烧录最怕的就是“第37片校验失败,重烧一遍又好了”。这时候不要急着当个例放过,实际上这种偶发失败往往是连接端子氧化、夹具松动、供电线路压降这些系统性问题的前兆。
我的做法是:每次烧录失败都保留现场的照片和软件日志截图,记录失败时的序号、烧录器编号、目标板电源状态。连续出现两三次失败后,就能看出是特定工位的问题还是共同问题。如果只是随机一次,重烧能过,那大概率是接触不良,检查排针和夹具的镀层。
注意:批量烧录时不要跳过校验步骤。校验虽然会占用一定时间,但它是剔除“假成功”的唯一保险。
最后再分享几个细节
这篇文章的实操内容就到这里。最后说几个我现在已经形成习惯的小细节,希望能帮你少走弯路:
第一个习惯是每个新项目第一次烧录成功后,我都会用ProWrite做一次完整回读,把读出的Hex和原始Hex做MD5对比,确认整条链路没有隐患。第二个习惯是把选项字节的配置截图存档,连同烧录工程文件一起放进项目的资料目录,这样哪怕半年后重新打样,也能快速复现烧录环境。第三个习惯是烧录时保持FMD-Link的线材固定不动,不要边烧边整理桌面,SWD的可靠性很大程度来自连接稳定性,动一次线就可能虚接一次。
烧录这件事,说复杂也复杂,说简单也简单。只要原理清楚、顺序固定、校验到位,绝大多数问题都能在几分钟内定位。希望这篇指南能让你从“奇奇怪怪的烧录失败”里抽身出来,把时间花在更有价值的代码上。