打印
[G32R]

G32R501与pyocd:一顿饭搞定的适配流程

[复制链接]
198|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

[i=s] 本帖最后由 kai迪皮 于 2025-7-3 19:50 编辑 [/i]<br /> <br />

1. 缘由:为何不走传统 “pack” 模式?

pyocd 本身支持通过 CMSIS-Pack 方式加载大多数 MCU 的下载算法,这也是其常见用法。但 G32R501 有一处比较“特殊”的安全机制 —— DCS 加解密,需要在进行 Flash 擦写前写入密钥。

若是通过 CMSIS-Pack 方式加载501会出现:

仅能识别芯片基本信息,却无法自动执行 DCS 密钥写入脚本,即无法正常擦写 Flash;


2. 总体思路:简单三步

本篇文章参考:AN1126_G32R501 IDE与工具链使用说明V1.1.pdf

(PS:也正是有官方的文档,我才说可以靠一顿饭搞定,O(∩_∩)O哈哈~)

我根据文档适配下来,简单总结有三大块工作:

  1. 让 pyocd 认出 M52 内核

现在的pyocd还未能识别 Cortex®-M52(其实就是Arm 中国的 Star-MC2),我们需要在源码中添加相关芯片 ID 与内核标识。

  1. 将 G32R501 的目标脚本放进 pyocd

这个脚本里包含具体 Flash 编程、擦写算法等信息。Geehy 官方 SDK 通常提供了相应的文件。

  1. 针对 DCS 解密脚本 (芯片非默认秘钥时)

如果使用默认密钥,其实不用太关心这个;但如果芯片是非默认密钥,就需额外定制,更改相应寄存器值。

只要“让 pyocd 会识别 → 有 G32R501 的编程算法 → 写入密钥”三步都到位,便能顺利在命令行里完成下载。


3. 具体操作流程

本章节给大家介绍一下添加的具体操作以及一些解释。

3.1 增加 M52 (Star-MC2) 内核识别

  1. component_ids.py

pyocd\coresight\component_ids.py 中,为 0xD24 标识的内核组件添加条目,以便 pyocd 识别到:

# Designer |Component Class |Part |Type |Archid |Name |Product
|Factory
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x31, 0x0a31) : CmpInfo('MTB', 'StarMC2', None ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x43, 0x1a01) : CmpInfo('ITM', 'StarMC2', ITM.factory ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x00, 0x1a02) : CmpInfo('DWT', 'StarMC2', DWTv2.factory ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x00, 0x1a03) : CmpInfo('BPU', 'StarMC2', FPB.factory ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x14, 0x1a14) : CmpInfo('CTI', 'StarMC2', None ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x00, 0x2a04) : CmpInfo('SCS', 'StarMC2', CortexM_v8M.factory ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0xD24, 0x13, 0x4a13) : CmpInfo('ETM', 'StarMC2', None ),
(ARM_CHINA_ID, CORESIGHT_CLASS, 0x132, 0x11, 0) : CmpInfo('TPIU', 'StarMC2', TPIU.factory ),

这些奇奇怪怪都是什么呢?

  • MTB(Memory Trace Buffer) 用于记录 MCU 的执行踪迹;
  • ITM(Instrumentation Trace Macrocell) 提供实时调试数据输出;
  • DWT(Data Watchpoint and Trace) 数据监测点与性能计数器;
  • BPU(Breakpoint Unit) 负责硬件断点控制;
  • CTI(Cross Trigger Interface) 多核/调试逻辑间的协同触发;
  • SCS(System Control Space) 存放 NVIC、SysTick 等核心系统寄存器;
  • ETM(Embedded Trace Macrocell) 进行实时指令/数据流跟踪;
  • TPIU(Trace Port Interface Unit)进行跟踪信息打包。
  1. core_ids.py

pyocd\coresight\core_ids.py 中:

ARM_China_StarMC2 = 0xD24
(CPUID_ARM_CHINA, ARM_China_StarMC2): "Star-MC2"

image-20250703192153802.png

这样,pyocd 如果识别到 CPUID = 0xD24,就知道这是 StarMC2(Cortex®-M52)。

3.2 拷贝 G32R501 的 Target 脚本

Geehy SDK 中通常提供了一个 target_G32R501xx.py(device_support\g32r501\common\pyOCD\),已经包含针对 G32R501 的 Flash 擦写算法。我们只需要将此文件拷贝到 pyocd\target\builtin 目录下,然后在同文件夹的 __init__.py 中加上:

from . import target_G32R501xx

'g32r501xx':  target_G32R501xx.G32R501xx,
'g32r501dxx': target_G32R501xx.G32R501Dxx,

3.3 针对 DCS 解密脚本 (芯片非默认秘钥时)

  1. 默认密钥场景 许多板卡还没改过出厂 DCS Key,target_G32R501xx.py中已写好解锁寄存器的步骤,基本无需额外操作。
  2. 非默认密钥场景 若你修改了 DCS 区,就需准备一个自定义 pyocd_user.py(device_support\g32r501\common\pyOCD\),里头以 NEW_DECRYPT_KEYS 的数组形式列出寄存器和值。
NEW_DECRYPT_KEYS = [
(0x50024020, 0xFFFFFFFF),
(0x50024024, 0xFFFFFFDC),
(0x50024028, 0xFFFFFFFF),
(0x5002402C, 0xFFFFFFFF),
(0x500240A0, 0xFFFFFFFF),
(0x500240A4, 0xFFFEDFFF),
(0x500240A8, 0xFFFFFFFF),
(0x500240AC, 0xFFFFFFFF),
]

烧写命令加 --script=/路径/pyocd_user.py,pyocd 会先写密钥再进行擦写。


4. 验证成果

完成上面的操作后,让我们在CMD命令窗口输入以下命令检查一下添加是否成功吧!

  1. pyocd list --targets

    若能显示 g32r501xx g32r501dxx,代表识别完成。

image-20250703192831321.png

  1. pyocd flash -t g32r501dxx "D:\Desktop\501\501_led_ex1_blinky.hex" --script="D:\Desktop\501\pyocd_user.py"

若是如下图所示,证明我们可以使用pyocd操作g32r501啦!

image-20250703193400489.png

5.总结

G32R501 的 DCS 机制为 pyocd 适配带来一丢丢挑战,幸运的是官方文档给出了足够的步骤说明。跟着官方文档一步步操作,为 pyocd 加点“内核识别”和“目标脚本”调料,就能“一顿饭”的时间内解决啦。

参考内容:

  1. https://bbs.21ic.com/icview-3464876-1-1.html
  2. AN1126_G32R501 IDE与工具链使用说明V1.1.pdf

今天的分享就到这里啦!如果本文对你有帮助,请点赞支持~

使用特权

评论回复
沙发
kai迪皮|  楼主 | 2025-7-3 19:49 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

253

帖子

11

粉丝