[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哈哈~)
我根据文档适配下来,简单总结有三大块工作:
- 让 pyocd 认出 M52 内核
现在的pyocd还未能识别 Cortex®-M52(其实就是Arm 中国的 Star-MC2),我们需要在源码中添加相关芯片 ID 与内核标识。
- 将 G32R501 的目标脚本放进 pyocd
这个脚本里包含具体 Flash 编程、擦写算法等信息。Geehy 官方 SDK 通常提供了相应的文件。
- 针对 DCS 解密脚本 (芯片非默认秘钥时)
如果使用默认密钥,其实不用太关心这个;但如果芯片是非默认密钥,就需额外定制,更改相应寄存器值。
只要“让 pyocd 会识别 → 有 G32R501 的编程算法 → 写入密钥”三步都到位,便能顺利在命令行里完成下载。
3. 具体操作流程
本章节给大家介绍一下添加的具体操作以及一些解释。
3.1 增加 M52 (Star-MC2) 内核识别
- 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)进行跟踪信息打包。
- core_ids.py
在 pyocd\coresight\core_ids.py
中:
ARM_China_StarMC2 = 0xD24
(CPUID_ARM_CHINA, ARM_China_StarMC2): "Star-MC2"

这样,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 解密脚本 (芯片非默认秘钥时)
- 默认密钥场景 许多板卡还没改过出厂 DCS Key,
target_G32R501xx.py
中已写好解锁寄存器的步骤,基本无需额外操作。
- 非默认密钥场景 若你修改了 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命令窗口输入以下命令检查一下添加是否成功吧!
-
pyocd list --targets
若能显示 g32r501xx
g32r501dxx
,代表识别完成。

pyocd flash -t g32r501dxx "D:\Desktop\501\501_led_ex1_blinky.hex" --script="D:\Desktop\501\pyocd_user.py"
若是如下图所示,证明我们可以使用pyocd操作g32r501啦!

5.总结
G32R501 的 DCS 机制为 pyocd 适配带来一丢丢挑战,幸运的是官方文档给出了足够的步骤说明。跟着官方文档一步步操作,为 pyocd 加点“内核识别”和“目标脚本”调料,就能“一顿饭”的时间内解决啦。
参考内容:
- https://bbs.21ic.com/icview-3464876-1-1.html
- AN1126_G32R501 IDE与工具链使用说明V1.1.pdf
今天的分享就到这里啦!如果本文对你有帮助,请点赞支持~