kai迪皮 发表于 2025-7-3 19:44

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

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

kai迪皮 发表于 2025-7-3 19:49

#申请原创# @21小跑堂   
页: [1]
查看完整版本: G32R501与pyocd:一顿饭搞定的适配流程