返回列表 发新帖我要提问本帖赏金: 100.00元(功能说明)

[APM32F4] 深度定制:将APM32F402芯片内置支持添加进pyOCD,从此告别Pack依赖!

[复制链接]
 楼主| kai迪皮 发表于 2025-6-25 19:24 | 显示全部楼层 |阅读模式
<
本帖最后由 kai迪皮 于 2025-6-25 19:27 编辑

#申请原创# @21小跑堂
1 前言

当我们需要给一款尚未被 pyocd 官方(或社区)列入内置支持清单的芯片添加下载/调试能力时,最常见的两种做法无非是:  • 利用 CMSIS-Pack 的外部支持文件;  • 直接在 pyocd 中编写一个 Target Python 脚本,从而实现“我说它行,它就行”。

因为我之前已经分享过使用 pack 进行下载/擦除固件的操作细节(看这里[https://bbs.21ic.com/icview-3329116-1-1.html])。这里就不再重复啰嗦,我们一起来看看如何把 APM32F402 芯片“嵌”进 pyocd,让它成为一个 pyocd 内置可识别的目标,后续我们可以任性地用 -t apm32f402xb 命令指定,无需任何 pack。


2 添加 APM32F402 的原因与思路

先简单说一下为什么我要专门把它添加到 pyocd 里,而不只是乖乖用 pack:

1.  方便团队内“分发”并保持一致:大家都使用自定义过的 pyocd,一旦脚本写好,扔到版本库里共享,两下就能跑通。

2.  能做更灵活的修改:比如我们想增大/缩小某些扇区、针对部分保护位做调试,也可以在脚本中写明,而不必依赖第三方。

3.  学习、掌握 pyocd 内部运行机制:这是加分项,避免日后遇到问题一头雾水。


思路其实很简单:

1.  从官方 SDK pack 中提取 .FLM 文件(Flash 编程算法);

2.  用 pyocd 提供的 generate_flash_algo.py 解析该 FLM 文件,生成 Python 形式的 Flash 算法数据;

3.  整合这些数据到一个新的 target_APM32F402xx.py 文件中,编写 FlashRegion、RamRegion 等信息;

4.  在 pyocd 的 target\builtin\__init__.py 注册该目标型号;

5.  验证一下能否成功执行擦除/下载操作。

3 操作步骤

3.1 前期准备

1. 安装 Python 和 pyocd  
• 确保 Python 3.7+ 环境可用;  
• 通过 “pip install pyocd” 安装 pyocd(我这里使用的是 pyocd 0.36.0+版本)。

2. 拿到 APM32F402 的 FLM 文件  
• 在极海官方的 “APM32F402_403_SDK_V1.0.1(https://www.geehy.com/uploads/tool/APM32F402_403_SDK_V1.0.1.zip)” 中,找到 “Geehy.APM32F4xx_DFP.1.0.7.pack” 并解压(使用7zip);
• 在解压后,你会搜到 “APM32F402_128.FLM” 或类似名字的文件,这就是我们使用的 Flash 算法文件。

3. 准备 generate_flash_algo.py
• 这个脚本通常随 pyocd 源码一起发布,可以从 GitHub (https://github.com/pyocd/pyOCD) 下载源码,源码中找到 “scripts/generate_flash_algo.py”。后面要用它来对 FLM 文件进行解析。


3.2 解析 .FLM 文件并生成 Python 算法脚本

把 APM32F402_128.FLM 复制到 generate_flash_algo.py 所在目录(或脚本能访问到的同级目录),再打开命令行进入到这个目录。执行示例:

  1. python generate_flash_algo.py -o apm32f402_flash_algo.py APM32F402_128.FLM --ram-address=0x20000000 --stack-size=0x1000

其中:
• -o apm32f402_flash_algo.py:输出文件名,可自行取。
• --ram-address=0x20000000:指定 RAM 在该 MCU 中的起始地址,以便脚本自动生成相关地址。
• --stack-size=0x1000:分配给 Flash 算法使用的栈空间,大小可根据需求调整。

运行后,如果一切顺利,就会看到一个名为 apm32f402_flash_algo.py 的文件生成。里面包含了 `'instructions': [ ]` 以及各类编程函数入口点 (`pc_init`, `pc_unInit` 等)。


3.3 编写 target\_APM32F402xx.py

接下来,我们要在 pyocd 的安装目录(比如 C:\Users<你的用户名>\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyocd\target\builtin)里,创建/编辑一个新的脚本文件,例如叫 “target_APM32F402xx.py”。  示例结构(可根据实际情况略做调整),大致如下:

  1. from ...coresight.coresight_target import CoreSightTarget  
  2. from ...core.memory_map import (FlashRegion, RamRegion, MemoryMap)

  3. # Option A: 直接贴上 generate_flash_algo.py 生成内容
  4. FLASH_ALGO = {  
  5.     'load_address': 0x20000000,  
  6.     'instructions': [  
  7.         0xe7fdbe00,  
  8.         0x4603b510,  
  9.         # ...(更多十六进制指令数据)...  
  10.         0x00000000  
  11.     ],  
  12.     'pc_init': 0x20000005,  
  13.     'pc_unInit': 0x20000035,  
  14.     'pc_program_page': 0x200000c3,  
  15.     'pc_erase_sector': 0x20000083,  
  16.     'pc_eraseAll': 0x20000047,  
  17.     'static_base': 0x2000013c,  
  18.     'begin_stack': 0x20001940,  
  19.     'end_stack': 0x20000940,  
  20.     'begin_data': 0x20001000,  
  21.     'page_size': 0x400,  
  22.     'analyzer_supported': False,  
  23.     'analyzer_address': 0x00000000,  
  24. }

  25. class APM32F402xB(CoreSightTarget):  
  26.     VENDOR = "Geehy"  

  27.     MEMORY_MAP = MemoryMap(
  28.         FlashRegion(
  29.             start=0x08000000,
  30.             length=0x20000,      # 128KB
  31.             blocksize=0x400,     # 通常编程粒度:1KB
  32.             is_boot_memory=True,
  33.             algo=FLASH_ALGO
  34.         ),
  35.         RamRegion(
  36.             start=0x20000000,
  37.             length=0x8000        # 比如 32KB, 或按实际修改
  38.         )
  39.     )

  40.     def __init__(self, session):
  41.         super().__init__(session, self.MEMORY_MAP)


• FlashRegion 和 RamRegion 的地址、容量等配置要和你的 APM32F402 实际硬件一致,避免产生越界或编程错误。
• 128K 的 Flash ,起始地址是 0x08000000。  
• name / VENDOR 芯片厂商名称,这里是“Geehy”。


3.4 注册目标型号

在完成对 “target_APM32F402xx.py” 的编写后,我们需要让 pyocd 知道有这么一个新的目标类可供使用。换句话说,要将我们定义的 “APM32F402xB” 正式注册到 pyocd 的内置目标字典中,这样在启动 pyocd 时,它就能自动发现并识别。

下面是一个示例做法,展示如何修改 “builtin/_init_.py”,以将 “apm32f402xb” 这个目标名映射到我们定义好的 “APM32F402xB” 类上。示例代码为:

  1. from . import target_APM32F402xx

  2. BUILTIN_TARGETS = {
  3.     # 这里若已存在其它已注册目标,可保持不动
  4.     "apm32f402xb": target_APM32F402xx.APM32F402xB,
  5. }


• 第 1 行使用 “from . import target\_APM32F402xx” 来引入同文件夹下的 “target\_APM32F402xx.py” 模块;  
• 随后在 BUILTIN_TARGETS 字典中,为 “apm32f402xb” 指定了对应的值,即我们在 “target\_APM32F402xx.py” 内声明的 “APM32F402xB” 类。

这样就 OK 了,pyocd 启动时会去扫描并认识到 “apm32f402xb” 这个新目标。

3.5 测试验证

1. 查看目标列表
在命令行输入:
  1. pyocd list --targets

若输出包含 “apm32f402xb”,则说明 pyocd 已能识别。

list.png

2. 测试擦除  
试试:
  1. pyocd erase --chip -t apm32f402xb

这会使用我们定制的 Flash 算法,对整个芯片进行擦除。如果过程顺利完成,说明脚本多半没啥大问题了!

erase.png

3. 测试下载  

若你有简单的 .hex 或 .elf 程序,比如一些 LED 闪烁固件,可以执行:
  1. pyocd flash -t apm32f402xb D:\Desktop\402\402_pyocd\402_pyocd_source\APM32F402_GPIO_Toggle.hex

flash.png

烧写成功后,观察下板子的行为,就知道是否真的写入成功。

到这步,恭喜你,APM32F402 已和 pyocd 无缝融合,不再依赖任何 pack 文件,后续随时都能愉快地下载/擦除/调试。

这里 402_pyocd_source.zip (3.05 KB, 下载次数: 0) 是target_APM32F402xx.py和闪灯测试程序,欢迎大家试一试哟(不要忘了3.4的注册芯片哦)~

打赏榜单

21小跑堂 打赏了 100.00 元 2025-06-30
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

提取FLASH算法,通过pyocd 解析,整合到APM32F402xx.py 文件中,实现无需pack的芯片调试下载功能。整体思路清晰,实现流程完善。  发表于 2025-6-30 16:40
涡流远见者 发表于 2025-7-1 19:14 | 显示全部楼层
看上去可以在ubuntu上面烧录MCU了
 楼主| kai迪皮 发表于 2025-7-1 19:22 | 显示全部楼层
涡流远见者 发表于 2025-7-1 19:14
看上去可以在ubuntu上面烧录MCU了

是的,pyocd支持多平台的。理论上只要有python环境就行
涡流远见者 发表于 2025-7-2 14:03 | 显示全部楼层
嗯嗯,我们计划把嵌入式设备放到机房,进行远程开发。这样硬件可以共享。
如果Ubuntu系统可以的话, 我就省得再部署一台Windows主机了
谢谢楼主
 楼主| kai迪皮 发表于 2025-7-2 16:29 | 显示全部楼层
涡流远见者 发表于 2025-7-2 14:03
嗯嗯,我们计划把嵌入式设备放到机房,进行远程开发。这样硬件可以共享。
如果Ubuntu系统可以的话, 我就省 ...

可以的Ubuntu下只要部署好python+pyocd环境就可以了
ShimmeringDawn 发表于 2025-7-5 19:19 | 显示全部楼层
现在单片机都可以部署ubuntu了?
 楼主| kai迪皮 发表于 2025-7-7 14:02 | 显示全部楼层
ShimmeringDawn 发表于 2025-7-5 19:19
现在单片机都可以部署ubuntu了?

不是部署Ubuntu,是在Ubuntu下开发MCU,
涡流远见者 发表于 2025-7-16 11:01 | 显示全部楼层
kai迪皮 发表于 2025-7-2 16:29
可以的Ubuntu下只要部署好python+pyocd环境就可以了

抽时间部署一下。
不想在Windows下开发了
 楼主| kai迪皮 发表于 2025-7-16 12:23 | 显示全部楼层
涡流远见者 发表于 2025-7-16 11:01
抽时间部署一下。
不想在Windows下开发了

哈哈,期待你的部署分享~
涡流远见者 发表于 2025-7-17 09:51 | 显示全部楼层
唉呀!这想愉个懒还不行了~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

292

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部

43

主题

292

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部