拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

国产MCU烧录实战:HC32、GD32、FM33在JFlash下的配置与排障

国产MCU烧录实战:HC32、GD32、FM33在JFlash下的配置与排障 老周我又来了。前阵子连续给三个项目做产线烧录支持芯片分别用了小华半导体的HC32、兆易创新的GD32和复旦微的FM33三款都是国产MCU里非常能打的型号。烧录本身看着是小事但真到了产线或者维修现场各种连不上、锁死、算法不对的问题能把人逼疯。这篇文章我就把这三个系列芯片在JFlash下的烧录实战经验完整整理出来从环境准备、设备配置、固件格式到HC32/GD32/FM33各自的连接细节、解锁方法、批量烧录脚本再到高频问题排查一次讲透。如果你是刚开始接触国产MCU的嵌入式工程师或者在产线上负责烧录工序、经常被“烧录失败”折腾的弟兄这篇文章可以做一份直接抄作业的参考手册。1. 为什么国产MCU的烧录绕不开JFlash1.1 从一次产线事故说起先讲个真实场景。上个月在一个朋友工厂帮忙他们用GD32F103做了一款表计类产品产线用Keil烧录结果十台里有两三台报错“Cannot access target”返工率很高。我过去一看烧录器用的是几十块钱的ST-Link clone算法选的是STM32F103接线又长又乱SWD时钟频率设成了4MHz加上GD32和STM32的Flash算法本来就不完全一样这种配置能稳定才怪。后来我把烧录方案整体换成了JFlash配合J-Link固件文件从Keil导出的hex直接加载SWD速度降到1MHz连接模式勾选“Connect under Reset”一整批两百多台板子再没出过问题。这件事让我更加确认JFlash这种独立的烧录工具在产线、返修、备件烧录这些场景里比IDE自带的烧录功能靠谱太多。JFlash是SEGGER官方推出的一款独立Flash编程软件配合J-Link调试器使用可以脱离Keil、IAR这些IDE单独完成芯片擦除、编程、校验、读回等操作。它的优势在于干净、直接、可控性强而且对国产芯片的支持越来越完善HC32、GD32、FM33这些主流系列在新版JFlash中都有对应的Device支持。1.2 三个系列芯片的差异与烧录认知HC32、GD32、FM33虽然都是国产MCU但核心、Flash布局、烧录方式差别不小搞混了很容易踩坑。我把它们的关键信息列个表先建立一个基本认知系列厂商核心代表型号主Flash基址JFlash支持的获取方式HC32小华半导体Cortex-M4 / M0HC32F460、HC32F4A0、HC32L1360x00000000新版自带或手动添加XMLGD32兆易创新Cortex-M3 / M4 / M23GD32F103、GD32F303、GD32F4070x08000000新版自带Device选项FM33复旦微Cortex-M0FM33G0xx、FM33A0xx、FM33LC0xx0x00000000手动添加XML或官方工具这三个系列的Flash基址都不一样这一点在加载bin文件时特别关键文件放错地址轻则验证失败重则把芯片搞成砖。后面我会在对应章节里分别详细讲。2. 动手前的准备工具版本、驱动与固件格式2.1 J-Link/JFlash版本对国产芯片支持的影响很多人烧录失败的第一原因不是接线错了而是JFlash版本太老。国产芯片的Device支持基本是靠SEGGER在软件迭代中逐步加入的比如HC32F460这种型号老版本的JFlash里根本找不到自然烧不了。所以我的第一条建议是去SEGGER官网把JLink软件包升级到当前最新版本然后结合你自己的芯片型号去芯片原厂官网找对应的“JLink支持包”或者“Device Pack”。我见过有工程师用V6.x版本的老JFlash硬烧HC32F460折腾了一下午没连上后来换了V9.4x版本Device列表里直接就有HC32F460连上就开烧。工具版本这块真的不能省。安装完JLink驱动后我建议先打开JFlash自带的Device列表确认一下在JFlash主界面按F7或者进入Options - Project Settings - CPU Device在弹出的窗口里搜索你的芯片型号。如果能在列表里搜到说明支持直接使用如果搜不到才需要考虑手动添加XML设备描述。2.2 固件格式hex、bin、elf怎么选烧录前还有一个绕不开的问题用哪种固件文件。hex文件是我最推荐的量产格式。它内部自带了起始地址信息JFlash加载后能自动把每个段放到正确位置几乎不需要人为干预不容易烧错地址。Keil、IAR编译后默认输出的就是hex直接拿来用。bin文件是纯粹的二进制镜像没有地址信息加载到JFlash后必须在“Programming Options”里手动指定目标起始地址地址填错就会烧到错误的位置。这个格式适合对存储布局特别清楚的场景。elf文件包含调试信息和符号表JFlash也能识别但通常体积较大量产时反而没什么优势。调试阶段可以直接在JLink的工具里用elf产线烧录我更推荐hex。我自己的习惯是编译工程时同时输出hex和bin产线脚本固定用hex因为hex对起始地址的容错性最好可以避免产线工人或者自动化脚本把bin文件地址配错。3. HC32系列JFlash配置与烧录全流程3.1 HC32在JFlash中的识别方法小华半导体的HC32系列现在在JFlash里支持得还不错以目前主流的HC32F460为例只要JLink软件版本足够新Device选择窗口里搜索“HC32F460”就能找到对应的型号。如果你的JFlash版本里没有或者你的HC32型号比较小众还有一招手动添加JLinkDevices.xml。这个文件通常位于JLink安装目录下路径类似C:\Program Files (x86)\SEGGER\JLink\JLinkDevices.xml在文件末尾的Data节点里按下面的结构加一段设备描述注意Loader路径和算法文件要和你获取到的支持包保持一致这里给一个示意结构Device ChipInfo VendorXHSC NameHC32F460 CoreJLINK_CORE_CORTEX_M4 WorkRAMAddr0x20000000 WorkRAMSize0x10000 / FlashBankInfo NameFlash BaseAddr0x00000000 MaxSize0x80000 LoaderDevices/XHSC/HC32F460.elf LoaderTypeFLASH_ALGO_TYPE_OPEN / /Device改完XML文件后重启JFlash重新搜索Device就能看到手动添加的型号。这里要提醒一句Loader这个算法文件必须真实存在而且路径不能写错否则连接后执行Program会报“Flash algorithm not found”之类的错误。更稳妥的做法是直接用JFlash图形界面加载原厂提供的.JLinkScript或者.elf算法文件而不是手写XML手写只是救急方案。3.2 HC32F460的完整烧录步骤HC32F460是Cortex-M4内核主频能到200MHzFlash最大512KBRAM 192KB在国产高端MCU里很常用。它的烧录流程我按步骤拆开讲。第一步在JFlash里新建工程。打开JFlashFile - New ProjectDevice选择HC32F460或你的具体型号Interface选SWD速率先设置成1000kHz后面稳定了再往上提。第二步加载固件。File - Open Data File选择你编译生成的hex文件。加载后JFlash下方的“Data File”区域会显示文件内容以及它内部定义的地址范围注意核对一下起始地址是不是0x00000000如果不是说明你的链接脚本可能做了重映射要确认这是不是你想要的。第三步连接目标板。Target - Connect。连接成功的话日志窗口会显示类似“Connected successfully”的信息同时会读出芯片ID。如果连接失败先把目标板断电检查SWDIO、SWCLK、GND三根线是不是接对了然后再试试把JFlash的Interface Speed降到100kHz或者勾选Target - Manual Programming - Connect under Reset。第四步执行烧录。Target - Manual Programming - Program。在编程选项里建议勾选“Erase Chip”或者“Erase Sectors”确保旧数据被清干净然后再勾选“Program”和“Verify”。Verify是对写入内容做校验强烈建议每次都勾产线上这一步能挡掉不少偶发性问题。第五步编程完成后可以选择执行“Reset and Run”让芯片直接运行新固件。如果这个选项不起作用也可以手动断电重新上电。3.3 HC32的选项字节与量产建议HC32系列烧录还要特别注意选项字节Option Bytes。这类字节区域存的是芯片的读保护等级、看门狗配置、启动模式等关键信息用JFlash烧录时一般不会自动去动它但如果你用全片擦除Erase Chip有些型号会把选项字节也擦掉导致芯片上电后进入异常状态。我遇到过一台HC32F460全片擦除再烧录后芯片怎么都不运行后来发现是选项字节被擦掉了需要用原厂的“HC32F4A0系列烧录工具”重新配置选项字节把读保护设为关闭、启动地址指到Flash起始地址芯片才恢复正常。量产建议是这样的如果用产线自动化烧录尽量不要在JFlash里勾选全片擦除而是用“Erase Sectors”只擦除固件占用的扇区避免碰到选项字节区域。另外HC32有些型号的Flash起始地址在0x00000000但Boot区或者用户区可能有偏移具体要看DataSheet里的Memory Map。不同型号千万不要直接套用同一个配置模板我见过有人把HC32L136的模板用在HC32F460上结果烧录校验一直失败最后发现两个芯片的Flash扇区结构和Loader都不一样。4. GD32系列连接不上、锁死怎么办4.1 GD32的JFlash连接配置GD32在国产MCU里的占有率很高尤其是GD32F103系列引脚和STM32F103基本兼容很多工程师会直接替换使用。但请注意GD32和STM32在Flash算法、内核选项、读保护机制上都有差异不能想当然地把JFlash里的Device选成STM32来烧GD32短期可能能蒙对但风险很高比如Flash擦除时序不匹配导致数据错乱、校验失败甚至把芯片锁住。正确做法是在JFlash Device列表里搜索“GD32F103C8”或“GD32F103CB”这类具体型号。新版JFlash里GD32的设备支持很全F1、F3、F4系列基本都有。连接接口选SWD速率一样从1MHz开始起步。GD32的SWD连接有一个很常见的坑很多GD32用户程序会复用PB3、PB4、PA15这些调试引脚一旦程序把这些引脚配置成普通GPIOJFlash下次连接时就找不到内核了。这种问题在STM32上也存在但GD32的引脚下电保持特性稍有不同更容易出现。解决方案就是连接时勾选“Connect under Reset”在芯片复位期间抢先把内核停住不让用户程序有机会关闭调试口。如果还不行就需要把BOOT0拉高让芯片从系统存储器启动再重新连接。4.2 GD32被锁的解锁实操我在网上看到“GD32单片机锁住了解锁方法”这种搜索词就知道不少朋友踩过这个坑。GD32的锁死绝大多数是两种原因一是用户代码把SWD引脚复用掉了调试口失效二是意外设置或误触发了读保护导致JLink连接时报错“Cannot connect to target”或者“Error: Flash Download failed - Cortex-M3”。先说最常见的第一种情况SWD引脚被复用。处理办法很简单把BOOT0引脚拉高重新上电让芯片进入系统存储器启动模式这时用户代码不会运行SWD引脚恢复默认功能JFlash就能连上了。连接成功后执行一次全片擦除然后重新烧录一版不带SWD复用功能的代码。再说读保护的情况。GD32的读保护如果只是Level 1可以用JLink Command工具解锁。打开JLink Commander输入以下命令connect GD32F103CB unlock GD32F103CBunlock命令会通过清除选项字节来解除读保护但要注意这个操作会同时把Flash里的内容全部擦除所以解锁前你要是还想要里面的固件或数据先想想有没有备份。解锁完成后重新连接JFlash就可以正常烧录了。还有一个必须强调的红线GD32的读保护如果被设置成了最高级别也就是Level 2那芯片是完全锁死的没有任何方式通过调试接口降级或者擦除等于物理报废。所以不管是测试代码还是量产固件只要不是产品终极防抄板需求千万不要在开发阶段把保护级别调到Level 2。4.3 没有J-Link时的DFU烧录方案有些现场维护的场合工程师手里没有J-Link这时候如果芯片支持DFU下载也能应急。GD32部分型号比如GD32F103系列的部分子型号支持通过USB DFU方式下载固件操作方法是按住BOOT0键重新上电USB连接电脑设备管理器里会出现一个“GD32 DFU”设备。第一次使用需要在电脑上安装DFU驱动可以用Zadig工具给这个设备安装WinUSB驱动也可以装GD32官方提供的DFU驱动包。驱动就绪后用DfuSeDemo或GD32官方DFU工具加载hex文件点击下载即可。DFU烧录的速度比JLink烧录慢不少只建议在调试或返修场景用产线大批量烧录还是老老实实上J-Link。另外DFU能不能用、BOOT引脚的具体组合不同型号不一样动手前先翻一翻该型号数据手册的Boot Configuration章节。5. FM33系列复旦微低功耗MCU烧录要点5.1 FM33的支持情况与XML添加方法复旦微的FM33系列主要用于表计、传感器、电池供电类产品内核基本都是Cortex-M0功耗指标做得很出色。但在JFlash的使用上它比HC32和GD32要更折腾一点因为SEGGER官方对FM33这类相对垂直的系列Device支持列表更新得没那么快老版本JFlash往往搜不到。解决思路和HC32是一样的检查JFlash版本升级到最新然后搜索“FM33G0”、“FM33A0”之类的关键词。如果列表里确实没有你的具体型号就手动在JLinkDevices.xml里添加设备描述。以FM33G0xx为例可以参照下面这个结构来写Loader部分要按你获取到的算法文件实际路径填写Device ChipInfo VendorFM NameFM33G0xx CoreJLINK_CORE_CORTEX_M0 WorkRAMAddr0x20000000 WorkRAMSize0x1000 / FlashBankInfo NameFlash BaseAddr0x00000000 MaxSize0x10000 LoaderDevices/FM/FM33G0xx.elf LoaderTypeFLASH_ALGO_TYPE_OPEN / /Device手动加XML之前先确认你手上有没有对应的Flash算法文件。很多时候原厂提供的支持包是给自家烧录工具用的并不会直接生成SEGGER能用的.elf算法。如果你在官网上拿到的是类似“FM33XX Programming Tool”的独立工具包那就不必硬在JFlash里折腾直接用官方工具反而更省心。5.2 FM33G0xx烧录流程与选项字节备注FM33G0xx的烧录流程和前面讲的HC32大同小异JFlash新建工程、选择Device或加载自定义算法、加载hex/bin、连接、编程、校验。这里我补充几个容易被忽略的细节。第一FM33G0xx的Flash基址通常是0x00000000和HC32一样和GD32的0x08000000不同。加载bin文件时起始地址一定要按目标型号数据手册为准不要套用其他芯片的经验。第二FM33系列很多型号出厂时SWD调试口默认是可用的但如果你在代码里修改了选项字节把调试口关闭了再想通过SWD连回来就比较麻烦往往需要借助官方工具、串口ISP或者特殊的恢复时序。所以在JFlash里尽量不要去动Option Bytes区域除非你完全清楚自己在做什么。第三FM33的烧录电压范围比较窄部分型号最低工作电压只有1.8V左右如果烧录器供电和目标板供电不一致可能导致连接不稳定。产线最好统一用目标板自己的电源供电JFlash这边只接SWDIO、SWCLK、GND不接J-Link的VTref避免两个电源系统互相干扰。我自己用FM33G0系列的体会是它在低功耗场景确实很强但烧录生态比ST、GD这类主流系列稍微滞后选型时除了看芯片性能也要评估你团队手里的烧录工具链能不能跟上。6. 三款芯片通用的烧录技巧与参数解析6.1 SWD接口、速度与复位策略接触的芯片越多越觉得SWD基础功夫不能省。SWD只需要四根线SWDIO、SWCLK、GND再加一根VTref供电检测线。接线看起来简单但产线上的坑恰恰容易出在这几根线上。SWD速度是第一个要调的参数。速度过高CRC校验会随机失败烧录一中断就得重来。一般规范线长不超过20cm、没有屏蔽的情况下2MHz以下是安全区间产线线材又长又乱的话降到1MHz甚至500kHz最保险。有人总觉得速度越快效率越高但量产最怕的是不稳定返工一次失败重烧的时间把提速省下来的时间全吃回去了。第二个是复位策略。很多国产M0、M4芯片在烧录时要配合“Connect under Reset”才能稳定连接。原理是在复位释放瞬间内核还停在复位状态调试器趁机接管控制权这样用户程序里的引脚复用、调试口关闭等配置都还没来得及执行。JFlash里在Target - Manual Programming菜单下可以勾选这个选项。遇到“Could not find core”这类报错先别怀疑芯片坏了试着勾上它成功率能提升一大截。第三个是VTref的处理。J-Link通过目标板的VTref引脚检测供电电压。如果目标板没给VTref供电JLink会认为目标板没上电拒绝连接。所以哪怕你的目标板只需要SWDIO、SWCLK、GND三根线也要确保VTref有电通常是把目标板的3.3V电源接一根线到JLink的VTref引脚。6.2 烧录之后的校验与启动配置烧录完成不等于万事大吉。我见过产线上一批板子烧录时报“Program OK”但实际运行完全跑不起来最后发现是固件某段数据在写入过程中静默出错而烧录步骤里没勾选Verify数据错误根本没有被发现。Verify和Program一样重要。JFlash在Target - Manual Programming里提供了Verify功能它会把芯片Flash里的内容和Data File里的内容逐字节比对。产线自动化脚本里无论用界面还是命令行都建议把“Program Verify”绑定在一起哪怕这会多花一点时间。启动配置也值得讲一下。JFlash编程完成后可以选择“Reset and Run”让芯片自动复位并运行。不过有些国产芯片对复位向量有额外要求或者在烧录时把用户程序放在非默认启动地址这时候直接复位可能还是跑的旧固件或者什么都不跑。遇到这种情况要么手动断电重上电要么检查链接脚本里的启动地址和选项字节配置。6.3 批量烧录的命令行玩法产线烧录量一大手工点JFlash界面就不现实了效率太低还容易误操作。JFlash支持完全的命令行烧录模式这是产线自动化的关键。下面是一个我常用的批处理脚本示例JFlash.exe -openprj C:\prod\GD32F103C8.jflash -open C:\prod\firmware.hex -connect -erase -program -verify -startapp -exit参数含义拆开看-openprj加载提前配置好的JFlash工程文件里面已经选好了Device、SWD速度、连接方式等。-open打开待烧录的固件文件。-connect执行连接目标板。-erase先擦除。-program执行编程写入。-verify烧录后校验必加项。-startapp烧录完成后启动应用程序。-exit全部完成后退出JFlash方便脚本循环调用。如果需要烧录多块板子可以用一个循环脚本不断调用这个命令板子接好线后自动执行。产线上真正稳定可靠的方案基本都是这种“JFlash命令行机械治具/气动压紧”的组合。另外JLink工具链里还有JFlash Lite、JLink Commander这些工具按场景选用即可。JLink Commander适合做底层调试和快速解锁JFlash更适合独立的编程任务。7. 高频问题排查速查表这一节把我在HC32、GD32、FM33烧录过程中遇到过的典型问题整理成表格方便大家在实际踩坑时快速对照。问题现象可能原因解决办法JFlash找不到目标设备型号JLink版本过旧或未装支持包升级JLink软件到最新版或手动添加JLinkDevices.xml连接时报“Cannot connect to target”SWD接线错误、目标板没上电、芯片被读保护检查四线连接确认VTref有电勾选Connect under Reset报“Could not find core”用户程序关闭了调试口或复位引脚被拉死BOOT0拉高重新上电或用复位期间连接方式抢占内核Program时报“Flash algorithm not found”手动添加XML时Loader路径错误或算法文件缺失核对Loader文件路径重新导入原厂提供的算法文件Program后Verify失败SWD速度太高、线材干扰、电压不稳降低SWD速度到1MHz以下检查线材长度和供电电压全片擦除后芯片不运行选项字节被擦掉启动配置丢失用原厂工具重配选项字节或改用Erase Sectors方式重复烧录几次后芯片就锁死读保护级别被误设为Level 2不要在产品开发阶段设置最高读保护Level 2无法恢复keil5里烧录失败但JFlash正常Keil的Flash算法或Debug配置不对检查Keil的Flash Download选项卡确保Device算法和芯片匹配排查思路比具体命令更重要。我自己的排查顺序永远是先看硬件再看软件最后查配置。焊错线、虚焊这种低级问题占了烧录故障的一半以上排除硬件问题后优先更新JLink软件和芯片支持包再解决不了就检查连接模式、速度、复位策略这些烧录参数最后才怀疑芯片本身。写在最后的几点心里话折腾了这些年MCU烧录我最大的体会是芯片性能再强烧录环节不稳定产线效率全是白费。很多人觉得烧录是个“能跑就行”的活其实里面小坑特别多尤其是国产芯片型号越来越丰富每家的Flash布局、选项字节、调试接口行为都不一样完全没法用一套经验通吃。我个人建议不管你现在用的是HC32、GD32、FM33还是其他国产MCU都先花半天时间把自己手头的烧录工具链完整顺一遍JLink软件是不是最新、芯片支持包有没有装全、JFlash工程配置文件是不是按具体型号单独保存、产线脚本有没有把Verify加上。这些基本功就像测试用例一样短期看好像多花了时间长期看帮你省掉的是无数个加班的夜晚。最后再分享一个小技巧在JFlash工程里把Device型号、SWD速度、连接方式、擦除方式、校验选项都固定好后把这个.jflash工程文件复制一份当模板遇到同系列不同批次的芯片先拿模板试跑一块确认没问题再批量操作。这个习惯我延续了好几年可以说帮我挡掉了至少十次产线批量返工事故。
返回列表