未分类 · 2022年10月25日

基于VScode使用pyOCD进行单片机调试和下载及芯片包安装

一、起因

由于越来越喜欢用vscode进行单片机程序的编写,使用了一个CMSIS-DAP的调试器,这个调试器没办法用stlink和jlink进行调试,所以使用了这个基于python的pyOCD进行调试

二、什么是pyocd

pyocd 是 arm 开发的一个 python 包(python package),该软件包可以使用多种USB调试器对 arm cortex-M 微控制器进行调试、编程(烧录程序)。

说白了就是个下载的驱动软件目前支持 Daplink、ST-Link、jlink。目前从 pyocd github 上看到的,pyocd 内部默认安装70多个常用的单片机支持包,但是通过使用 CMSIS-Packs 几乎支持所有基于 comtex-m 内核的单片机。(是要能用keil、Eclipse写的单片机都可以用)

三、pyocd优点

pyocd 提供了命令行工具,使用这工具可以用来调试、烧录、擦除 MCU
pyocd 提供了python API,可是使用这些API来实现控制 MCU(读取MCU寄存器、暂停、运行、复位MCU等)
pyocd 支持 windows、linux、Mac操作系统

现在感觉,pyOCD还是很好用的。

四、安装pyocd

pyOCD官方文档链接:https://pyocd.io/docs/
1、由于pyocd是基于python开发的,所以你需要支持python环境、并将pip加入path环境中,这个过程很简单,这里就不做太多赘述,可以参考这个->点击教程
2、最新稳定版本的 pyOCD 可以通过 pip 安装,命令如下:

pip install -U pyocd

参考:https://pypi.org/project/pyocd/

五、使用pyocd

首先打开CMD、输入

pyocd --version

可以查看到安装的版本.

输入

pyocd --help


可以查看帮助信息、可以看到python提供了9条命令


commander跟cmd: 可交互的终端,
erase: 擦除命令
flash:烧录命令
reset:复位设备
gdbserver跟gdb:用于gdb调试的
json:以json格式输出信息
list:可以列出dap-link、目标IC、特定板子的信息
pack:用于管理CMSIS-Pack
server:运行debug服务

如果想知道上述命令的用法可以使用 pyocd + 上述中的一个命令 + -h/--help,如下:

这些命令各有什么用呢?什么情况下要用什么命令?这些命令怎么配合使用?

比如,使用 CMSIS-DAP 给 MCU 下载固件,一般会使用上位机 KIELL 通过 CMSIS-DAP 下载,首先 上位机 KEIL 能找到 CMSIS-DAP,然后需要选择所下载的 MCU,然后选择所要下载的固件,这 3 步都设置好后,就可以下载程序了,

根据这些,依次介绍 pyocd 的命令:

list or json:查看能够使用的调试器、支持的 MCU
pack:管理支持的 MCU
flash & erase : 对 MCU 进行编程、擦除
(1)pyocd list 命令
从 pyocd 帮助信息来看:

list List information about probes, targets, or boards.

可以知道 list 命令使用来查看 调试器、目标芯片、板子的信息,

pyocd list / pyocd list -p
列出连接到电脑上的 CMSIS-DAP 或者 ST link,当没接如任何pyocd所支持的设备时,如下:

接入了一个 CMSIS-DAP 跟 ST Link 后如下:

(1.1) pyocd list -t/--target
列出所支持的IC,可以是内置的,也可以是通过安装pack获得支持的,

上面图片展示了列出了 pyocd 内置的一部分 MCU。


我的电脑中已近安装了 STM32G4 的pack,上图中,STM32G4 系列后面就显示了 pack

(1.2) pyocd list -b/--board
列出所支持的板子,如下:

(2)pyocd json 命令

json Output information as JSON.

(2.1) pyocd json -t
从帮助信息来看,是输出所有已知的 target,先试下pyocd json -t命令,如下:

输出一大堆数据,除了有pyocd 版本信息外,就是一些MCU的信息,有MCU的厂商、型号,还有该信息是内置的还是来自pack。

试下能不能输出指定 MCU 的信息:

pyocd list 跟 pyocd json 功能应该是差不多的,都是输出一些信息,如接入了电脑的调试器信息,系统所支持的单片机等,只不过输出方式不同,pyocd list 是直接输出相关信息,pyocd json 是以 json 格式输出相关信息。

(3)pyocd pack 命令
pyocd 通过两种方法支持 MCU,一个是内置的(builtin),这个数量有限,还有一个是通过 pack 来支持,需要用pyocd 操作什么 MCU,安装对应的 pack , 类似 keil5 ,新安装的 Keil5 不支持任何单片机,如果要使用新安装的keil 支持某类型号单片机,需要安装对应的软件包。

pyocd 提供了一个内置的子命令来对pack进行管理,安装、查找、删除等,来看下 pyocd pack 命令的帮助信息:

送上图来看,有5个功能选项:

-c:清楚保存在电脑上的pack信息
-u:更新pack索引
-s:显示已安装的pack
-f:查找某个IC对应的pack
-i:安装指定的pack
pyocd 使用的 pack 有个默认的存放路劲,我电脑上为:

C:\Users\用户\AppData\Local\cmsis-pack-manager\cmsis-pack-manager
pyocd pack 命令就是对该目录的文件进行管理。

(3.1)pyocd pack -U
使用方法为:
pyocd pack -u

第一次使用该命令的时候,会在pyocd存放pack文件的默认路劲下下载不同厂商不同系列 MCU 的 pack 的描述文件(pdsc文件)和 index.json、aliases.json 文件。执行过一次之后,会从网络上更新相应的文件。下图是一个执行pyocd pack -u的结果,有出现错误。

下图是执行了pyocd pack -u 后,pack 所在文件夹多了很多文件:

(3.2)pyocd pack -f
使用方法为:

pyocd pack -f partnumber
该命令会显示出对应型号 MCU 的 pack 的信息,如下图,显示了 STM32G431 所对应 pack 的信息

(3.3)pyocd pack -i
使用方法为:

pyocd pack -i partnumber
该命令安装指定型号MCU的pack,如下图:

不过,由于网络的问题,一般很难下载完成,跟keil下载pack一样,非常慢,经常下载失败,可以手动下载所需的pack,然后放到对应目录,格式统一为这样、将前面的名字删掉。


pyocd pack -s
安装有pack后,执行结果为:

pyocd flash 命令
用CMSISDAP+STM32G4 如下:
STM32G4 的测试程序是用 Cube MX 创建工程、然后用vscode打开


第一次测试,首先执行 pyocd list查看是否成功识别到设备,确认能够找到 CMSIS-DAP 后。

输出的帮助信息看不出来 pyocd flash 应该怎么用:
非常多选项,这里只关注烧录的功能,通过查阅 pyocd 的文档,了解到可以使用如下命令来给MCU烧录程序:
pyocd flash -t mcu_partnumber firmware
我的 MCU 是 stm32G431RBTx,测试固件是 HAL_06_LCD.hex,尝试使用命令 :
pyocd flash -t stm32G431RBTx HAL_06_LCD.hex来烧录程序,结果如下:

接着我们可以使用vscode配置pyocd了
用EIDE打开,在烧入配置中选择pyOCD

在芯片选择上,选择已经安装过pack包的芯片


点击下载按钮,就可以完成程序的下载

程序的DEBUG仿真

选择编辑器设置,将axf装换为elf的选项勾选

安装cortex-Debug

点击debug选择pyocd就可以实现对程序的仿真

由于pyocd使用python开发,可以使用 pyocd python api 做个上位机一键烧录,或实现云端服务器烧入。