起因

选型用 GD32E230(可 PIN2PIN 代换 STM32F030C8T6),开发到调试阶段,接上 J-Link 却发现 MDK 识别不了这颗芯片,调试进行不下去。

关于GD32E230

2018年11月1日,业界领先的半导体供应商兆易创新(GigaDevice)正式推出主频高达72MHz的GD32E230系列超值型微控制器新品,并宣布开启Arm® Cortex®-M23内核普及应用的全新世代。

芯片代换

GD32E230可以PIN2PIN代换STM32F030C8T6

注意“PIN2PIN”只保证引脚兼容:内核并不相同——F030 是 Cortex-M0,GD32E230 是 Cortex-M23。引脚和外设寄存器布局大体沿兼容路线,代码迁移成本低,但工程必须按新芯片重建/重编译,架构相关的底层代码(启动文件、内核寄存器操作)不能照搬。

现象与根因

现象:MDK v5.25 和 MDK v5.26 pre-release 识别不了 ARMv8-M 架构的 MCU,J-Link 调试无法进行。

根因是一条“新内核 → 工具链全家都要跟上”的因果链:GD32E230 的 Cortex-M23 内核采用 ARMv8-M 基线架构(带 TrustZone 扩展的架构版本),对编译器意味着新的架构选项(-mcpu=cortex-m23),对调试器意味着新的内核识别与调试协议支持。工具链的每个环节——MDK 的架构列表、器件支持包(DFP)、J-Link 驱动里的器件库——都必须包含 ARMv8-M/Cortex-M23 才能走通。旧版本 MDK 的架构列表里没有它,于是在器件识别这一步就卡死。

解决方案

既然自己解决不了问题,那就借助外部力量,好好利用下现代文明吧,信息时代的便利性是非常强大的,找到了解决方案,参考KEIL官网解决方案,这里简单再记录一下,在 MDK v5.25 和 MDK v5.26 pre-release 如果出现识别不了ARMv8-M 架构的 MCU ,在MDK的安装目录找到 Tools.ini 文件,打开并编辑这个文件(原文此处附有 Tools.ini 编辑的截图,导出时图片丢失,具体改法以 KEIL 官网该解决方案原文为准)。

除改 Tools.ini 外,按“工具链逐环节升级”的思路还有几条常规路径,都能解决这类识别问题:

  • 升级 MDK 到正式支持 ARMv8-M 的版本:这是根治办法,老版本的架构列表改配置只是权宜;
  • 安装 GD32E230 的器件支持包(DFP,Pack Installer 里搜 GD32E230):让工程创建、启动文件、Flash 算法都对上这颗芯片;
  • 更新 SEGGER J-Link 驱动到包含 GD32E230 的版本:J-Link 的器件库是驱动自带的,太旧的驱动不认识 Cortex-M23 的 GD 芯片;实在不行可在 J-Link 配置里选通用 “Cortex-M23” 器件顶替(功能可用,Flash 下载算法要自己确认)。

踩坑记录与注意事项

  • 新架构芯片调试问题先查三样:MDK 版本、DFP 器件包、J-Link 驱动版本——三者任一不认识 ARMv8-M 都会卡住,逐个排比乱试快;
  • 别只改 Tools.ini 就收工:它能骗过架构识别,但编译器/调试器对 M23 的真实支持还是由版本决定,正式项目升级版本;
  • PIN2PIN ≠ 代码直接搬:内核从 M0 换到 M23,启动文件和内核相关代码要换成 GD 官方提供的对应版本;
  • Flash 下载算法要选对:代换场景下工程往往从 F030 工程改来,Flash 算法仍是 ST 的就会下载失败,换成 GD32E230 的算法;
  • 查这类问题的信息源顺序:Keil 官网支持文档 → SEGGER 官网器件支持列表 → 芯片原厂(兆易创新)的 Keil Pack 与应用笔记。