G32R501与pyocd:一顿饭搞定的适配流程
本帖最后由 kai迪皮 于 2025-7-3 19:50 编辑# 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 与内核标识。
2. **将 G32R501 的目标脚本放进 pyocd**
这个脚本里包含具体 Flash 编程、擦写算法等信息。Geehy 官方 SDK 通常提供了相应的文件。
3. **针对 DCS 解密脚本(芯片非默认秘钥时)**
如果使用默认密钥,其实不用太关心这个;但如果芯片是非默认密钥,就需额外定制,更改相应寄存器值。
只要“让 pyocd 会识别 → 有 G32R501 的编程算法 → 写入密钥”三步都到位,便能顺利在命令行里完成下载。
---
# 3. 具体操作流程
本章节给大家介绍一下添加的具体操作以及一些解释。
## 3.1 增加 M52 (Star-MC2) 内核识别
1. **component\_ids.py**
在 `pyocd\coresight\component_ids.py` 中,为 0xD24 标识的内核组件添加条目,以便 pyocd 识别到:
```python
# 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)进行跟踪信息打包。
2. **core\_ids.py**
在 `pyocd\coresight\core_ids.py` 中:
```python
ARM_China_StarMC2 = 0xD24
(CPUID_ARM_CHINA, ARM_China_StarMC2): "Star-MC2"
```
!(data/attachment/forum/202507/03/194311pt2kzayv5youyeyk.png "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` 中加上:
```python
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` 的数组形式列出寄存器和值。
```c
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`,代表识别完成。
!(data/attachment/forum/202507/03/194256uglygdn663lydl3n.png "image-20250703192831321.png")
2. `pyocd flash -t g32r501dxx "D:\Desktop\501\501_led_ex1_blinky.hex" --script="D:\Desktop\501\pyocd_user.py"`
若是如下图所示,证明我们可以使用pyocd操作g32r501啦!
!(data/attachment/forum/202507/03/194321m25o2r3fioyllszs.png "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
今天的分享就到这里啦!如果本文对你有帮助,请点赞支持~
#申请原创# @21小跑堂
页:
[1]