1. 环境准备与J-Link安装
在Ubuntu下玩转HC32L110烧录,首先得把工具链搭好。我用的是一台Ubuntu 20.04的机器,实测22.04版本也完全兼容。硬件方面需要准备三样东西:带HC32L110芯片的开发板(推荐LilyGo T-HC32)、J-Link OB调试器(某宝百元以内就能搞定)、以及几根杜邦线。这里有个坑要注意——市面上有些廉价J-Link OB用的是STM32主控,建议选择带SN序列号的正版,稳定性会好很多。
安装J-Link驱动比想象中简单,直接去Segger官网下载Linux版.deb安装包。我用的V7.70a版本,执行sudo dpkg -i JLink_Linux_V770a_x86_64.deb就搞定了。安装完成后会生成两个关键目录:/opt/SEGGER/JLink_V770a存放实际文件,/opt/SEGGER/JLink是指向当前版本的软链接——这个设计很贴心,以后升级版本时PATH都不用改。
2. 芯片支持文件配置
要让J-Link认识HC32L110这个"小众"芯片,得手动添加设备支持。从华大官网下载的HC32L110_IDE包里有关键的两个.FLM算法文件(HC32L110B4_C4.FLM和HC32L110B6_C6.FLM),把它们拷贝到/opt/SEGGER/JLink/Devices/HDSC/目录下。这里有个细节:不同封装的芯片要选对应文件,B6/C6用32K版本,B4/C4用16K版本。
接着修改JLinkDevices.xml,在文件末尾</DataBase>前添加设备描述。我建议直接复制下面这段配置,注意WorkRAMSize参数要根据芯片型号调整(x4是0x800,x6是0x1000):
<Device> <ChipInfo Vendor="HDSC" Name="HC32L110x4" WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/> <FlashBankInfo Name="Flash_16K" BaseAddr="0x0" MaxSize="0x4000" Loader="Devices/HDSC/HC32L110B4_C4.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/> </Device>3. 图形化烧录实战
配置完成后,在终端输入/opt/SEGGER/JLink/JFlashExe就能启动烧录界面。第一次使用时需要手动选择设备型号——在Device栏输入"HC32"就会自动过滤出我们添加的HC32L110x4/x6选项。这里容易踩的坑是:如果选了错误的型号(比如用x6配置烧录x4芯片),可能会报"Flash download failed"错误。
连接硬件时要注意SWD接口定义:J-Link的1脚(VCC)不要接开发板,只需要接GND、SWDIO、SWCLK三根线。实测发现有些开发板的3.3V供电不足会导致连接不稳定,这时候可以单独给开发板供电。成功连接后,点击Production Programming(F7快捷键)就能完成烧录。建议在Project Settings里勾选"Start Application after programming",这样烧完程序会自动运行。
4. 命令行自动化集成
对于需要频繁烧录的开发者,图形界面效率太低。JLinkExe命令行工具才是终极解决方案。先准备一个烧录脚本(如download.jlink):
erase loadfile firmware.hex reset exit然后用单条命令完成烧录:
JLinkExe -device HC32L110x6 -if swd -speed 4000 -CommanderScript download.jlink这里有几个实用技巧:
-speed参数建议设为4000kHz,太高可能导致连接不稳定- 烧录.bin文件需要指定地址:
loadfile firmware.bin 0x0 - 添加
-AutoConnect 1参数可以自动重连
5. 深度集成Makefile
把烧录流程整合到Makefile里,实现编译烧录一条龙。下面是我的Makefile模板:
JLINK = /opt/SEGGER/JLink/JLinkExe JLINK_SCRIPT = download.jlink flash: $(TARGET).hex @echo "===== Programming $(TARGET).hex =====" @$(JLINK) -device HC32L110x6 -if swd -speed 4000 \ -CommanderScript $(JLINK_SCRIPT)配合VSCode的Task功能更高效:在.vscode/tasks.json中添加:
{ "label": "Flash Program", "type": "shell", "command": "make flash", "problemMatcher": [], "group": { "kind": "build", "isDefault": true } }6. 常见问题排查
遇到"Can not connect to target"错误时,按这个checklist排查:
- 检查SWD线序是否正确(GND-GND, SWDIO-IO, SWCLK-CLK)
- 尝试降低通信速率(-speed 1000)
- 开发板供电是否稳定(可外接电源)
- 芯片是否进入休眠模式(尝试先按复位键再烧录)
对于"Flash download failed"错误,可能是:
- 算法文件不匹配(检查.FLM文件路径)
- 芯片写保护未解除(在J-Flash里执行"Unsecure Chip")
- Flash地址越界(x4芯片不要烧录超过16K的程序)
7. 高级技巧:Python自动化控制
用pyOCD或者pylink库可以实现更灵活的烧录控制。这里分享一个用pylink的示例脚本:
import pylink jlink = pylink.JLink() jlink.open() jlink.connect('HC32L110x6', speed=4000) jlink.flash_file('firmware.hex', 0) jlink.reset()这个脚本的优势是可以集成单元测试——比如烧录后读取特定内存地址验证结果。我还常用它批量生产测试,配合pytest框架实现自动化质检。