本帖最后由 yang377156216 于 2022-9-27 14:57 编辑
#申请原创# @21小跑堂
前言
一直喜欢用开源调试工具和软件包的朋友,想必应该都知道 CMSIS-DAP Link 调试器和 openOCD 吧,今天先不讲 openOCD (太古老了)而选择另外一款开源调试组件 pyOCD来做介绍。事先得先准备好工具和要调试烧录的对象,手上刚好有一台 MM32-Link Mini 工具,它里面运行的是 DAP Link v1 版本固件,另外加上个 MM32F5277E9PV 最小系统核心板,齐活了。有意思的是,闲逛论坛和博客的时候无意间刷出来一篇相关的博文,里面介绍说“目前还没法儿使用 pyOCD 连接上 MM32F5277 系列芯片”,我心想不应该呀,于是就有了下面的尝试。
pyOCD 安装和环境搭建 pyOCD 是一个开源 Python 软件包,用于使用多种受支持的 USB 调试探针类型来编程和调试 Arm Cortex-M 微控制器。它是完全跨平台的,内置支持多达 70 种流行的 MCU,另外可以通过使用 CMSIS-Pack 来支持市场上的所有 Cortex-M 芯片。pyOCD 还可以使用 GDB Service 配合 GDB 调试芯片,支持多种 USB 探针,比如:CMSIS-DAP v1(HID)、CMSIS-DAP v2(WinUSB)、SEGGER J-Link、ST-LINK v2 和 ST-LINK v3 等。pyOCD 允许用户通过命令来:烧录、擦除、单步、停止、设置断点、全速运行、芯片上锁、读写外设寄存器、读写存储空间等操作。首先 python 环境需要自己提前准备好,python3和python2 都是可以支持的。pyOCD 的安装可用通过 pip install pyocd 命令自动安装 pyOCD 以及其依赖库,它的依赖库有:cmsis-pack-manger、intelhex、pyusb、pywinusb、pyelftools、pyyaml、six、pylink-square、prettytable、colorame 和 interbaltree。也可以借助国内的 pip 镜像网站下载进行下载,使用以下命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl pyocd
下载完毕后可以使用查看版本的命令和帮助命令,来确认是否正确安装和学习 pyOCD 的基本使用: pyocd --versionpyocd --help
pyOCD 的安装方式还可以通过源码方式,它的子命令有 cmd、erase、flash、reset、gdb、json、list 和 pack,涵盖了前面介绍的所有功能,具体每一条命令的实现不一一做介绍,大家可以网上搜索自行学习。由于我使用的是 DAP Link v1 版本,它使用的是 HID 协议,它配套 pyOCD 使用的话不需要安装 libusb (如果有实际需要,可以将 libusb-1.0.dll 放到 python 安装目录下面)。
pyOCD 连接和下载 MM32F5277 芯片 一般使用 J-Link 给 MCU 下载固件时,会使用上位机 J-Flash 或者 命令行模式,先连接到需要下载的 MCU,然后将所要下载的固件 load 到 MCU 中即可,那使用 DAP Link 和 pyOCD 的话基本也是这么个思路,需要依次使用 list or json、pack、flash & erase 这几条命令进行烧录。先使用 pyocd list -p 命令查看当前电脑上是否连接了 pyOCD 所支持的调试工具,我正常接入了 MM32-Link Mini,显示如下: 再使用 pyocd list -t/--target 命令查看当前 pyOCD 支持的 MCU,由于内建的列表中未包含灵动微的 MCU ,国产的我也只看到小华的身影:
那就得通过 pack 来支持要用到的 MCU 了,类似 Keil5 一样,需要安装对应的软件包,只是安装方式不一样。默认安装好 pyocd 后它使用的 pack 就会有个默认存放路径了,我电脑上的为: C:\Users\yang3\AppData\Local\cmsis-pack-manager
pyocd pack 命令就是对该目录的文件进行管理。接着,会先更新一下 pack 索引,使用命令 pyocd pack -u ,建议特殊的网络下载功能,不然从 keil 官网或者 github 上下载不同厂商不同系列 MCU 的 pack 的描述文件(pdsc文件)和 index.json、aliases.json 文件时会很慢,注意,这里只是把 keil 官方的 CMSIS PACK 列表里的内容更新到了本地路径中并且都能在 index.json 文件中找到,不在此列表里面的 MCU 是无法正确获取到 PACK 下载方式的:
经过上面更新后,发现 pack 描述包中无 MM32F5270 系列,找到 keil 官网 pack 列表,发现该颗料还未在列表中,好吧,无语了:
那只能先试一下之前一直玩的 MM32F3273G9P 了,使用 pyocd pack -f mm32f3273 命令是可以查到所在 pack 包的:
那么就可以使用 pyocd pack -i mm32f3273 命令来安装对应的 pack 包了,由于该次下载是通过灵动微官网地址所以最好关掉前面的特殊网络下载功能,成功下载安装好后会多出一个 MindMotion 的器件 pack 文件夹:
再使用前面的查看当前支持 MCU 的 list -t 命令或者使用 pyocd pack -s 命令,可以看到 mm32f3273 的 pack 包已经成功安装了,该 MCU 已经可以被 pyocd 所有命令支持了,所以接下来使用 erase 和 flash 命令来测试,可以看到能够正常擦写 MM32F3273G9P 的固件了: 那么问题来了,既然官方没有将 MM32F5277E9PV 这颗料的 pack 上传到 keil 官网列表去,该如何将它添加到 pyocd 支持中呢?直接将它的 pack 包按照 F3273 的样式添加到 MindMotion 文件夹内?于是试了一把,发现行不通的,这样做 pyocd 不能正确识别到的。折腾了一番,终于知道了,需要先将 MM32F5277E9PV 这颗料号相关的描述添加到 index.json 文件中,它管控着本地 pyocd 所有支持能够下载得到的 MCU pack,于是参照 F3273 的描述语句并且根据 MM32F5277E9PV 实际的规格改写了 index.json 索引文件,添加了以下描述代码: "MM32F5277E9PV": {
"name": "MM32F5277E9PV",
"memories": {
"IRAM1": {
"access": {
"read": true,
"write": true,
"execute": false,
"peripheral": false,
"secure": false,
"non_secure": false,
"non_secure_callable": false
},
"start": 536870912,
"size": 196608,
"startup": false,
"default": true
},
"IROM1": {
"access": {
"read": true,
"write": false,
"execute": true,
"peripheral": false,
"secure": false,
"non_secure": false,
"non_secure_callable": false
},
"start": 134217728,
"size": 262144,
"startup": true,
"default": true
}
},
"algorithms": [
{
"file_name": "Flash/MM32F5270_256.FLM",
"start": 134217728,
"size": 262144,
"default": true,
"ram_start": null,
"ram_size": null
}
],
"processor": {
"Symmetric": {
"units": 1,
"core": "Star-MC1",
"fpu": "None",
"mpu": "NotPresent"
}
},
"from_pack": {
"vendor": "MindMotion",
"pack": "MM32F5277E_DFP",
"version": "0.0.7",
"url": "http://www.mindmotion.com.cn/Download/MDK_KEIL/"
},
"vendor": "MindMotion:132",
"family": "MM32F5270 Series",
"sub_family": "MM32F5277E"
},
添加完以上代码后,从灵动微官方下载的 pack 包中提取 MindMotion.MM32F5277E_DFP.0.0.7.pdsc 文件(尾缀的版本需要自己添加)到同级目录下,此时已经可以通过 pyocd pack -i mm32f5277e9pv 命令将该系列的 pack 包下载到本地对应目录了: 本以为已经可以正常使用擦写命令操作芯片了,没成想遇到无法打开 pack 包的报错: 于是试着打开下载的 pack 包,发现无法正确解压: 不知道为什么从官网下载的 pack 包竟然无法解压缩,无法正常打开,于是,又想了个办法,直接将该目录下的 pack 包换成可以解压的包,将其名字改成 0.0.7.pack,然后再进行测试,这回终于正常了
: 经过以上一番折腾,已经可以正常用 pyOCD 连接上 MM32F5277E9PV 并且进行擦除、烧录固件等操作了,至于更深入的调试功能在此不做过多探究。另外,很多人估计喜欢使用 jlink 的 RTT 输出功能,还在为 DAP Link 没有配套的 RTT 上位机而苦恼的朋友们,我给大家推荐一款工具,DRTTView-windows-exe ,大家可以百度搜索一下,配套 DAP Link 使用,很香!
|
@21小跑堂 :在Linux系统里做开发就很有用了,Keil没有Linux版,这也是为什么PyOCD是ARM公司主导的原因,也是它支持Keil的pack包的原因。
对于单片机开发者来说,pyocd显得多此一举,但是在某些特殊场合还是非常好用的。如其他不懂单片机烧录的人员,pyocd就可以做个上位机一键烧录,摆脱跨行烧录的语言障碍。