开源pyOCD的使用介绍
pyOCD是一个开源Python软件包,用于使用多种受支持的USB调试探针类型来编程和调试Arm Cortex-M微控制器。它是完全跨平台的,并支持Linux,macOS和Windows。它内置支持多达70种流行的MCU。另外,通过使用CMSIS-Pack,几乎支持市场上的所有Cortex-M设备。pyOCD还可以作为GDB Service配合GDB调试芯片,支持多种探针,比如:CMSIS-DAP v1(HID)、CMSIS-DAP v2(WinUSB)、SEGGER J-Link、ST-LINK v2和ST-LINK v3。 pyOCD其实和openOCD功能类似,也是支持跨平台的。pyOCD允许用户通过命令来:烧录、擦除、单步、停止、设置断点、全速运行、芯片上锁、读写外设寄存器、读写存储空间等操作。不过网上对pyOCD的教程介绍比较少,不像openOCD那么多,增加了学习的难度。我索性花了半天的时间研究了一下,现在把我所知道的总结一下,希望对后来学习pyOCD的人有所帮助。如果有转载的需要,请务必标注出处。学习的同时也要时时刻刻分享,分享的同时,自己也会有所提升。
我的操作系统是64位的Win10,python的版本为3.8.3,pyOCD的版本为0.27.2,探针是DAP-LINK(CMSIS-DAP v2),单片机是stm32f103rc。下面的所有操作都是基于这个环境完成。
一、pyOCD的安装
pyOCD是一个python库,可用通过pip install pyocd就会自动安装pyOCD以及其依赖库。其中依赖库有:cmsis-pack-manger、intelhex、pyusb、pywinusb、pyelftools、pyyaml、six、pylink-square、prettytable、colorame和interbaltree。一般pip会去外网下库,速度很慢。我们可用借助国内的pip镜像网站下载。比如
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl pyocd
复制代码
速度就比较快了。安装完毕之后,可用查看pyOCD版本:
- C:\Users\86188\Desktop> pyocd --version
- 0.27.2
复制代码
二、查看pyOCD的帮助信息
如果你是第一次接触pyOCD并且什么都不知道,那么查看帮助文档是个好建议。可用输入如下命令查看帮助信息:
- C:\Users\86188\Desktop> pyocd --help
- usage: pyocd [-h] [-V] [--help-options] ...
- PyOCD debug tools for Arm Cortex devices
- optional arguments:
- -h, --help show this help message and exit
- -V, --version show program's version number and exit
- --help-options Display available user options.
- subcommands:
- commander Interactive command console.
- cmd Alias for 'commander'.
- erase Erase entire device flash or specified sectors.
- flash Program an image to device flash.
- reset Reset a device.
- gdbserver Run the gdb remote server(s).
- gdb Alias for 'gdbserver'.
- json Output information as JSON.
- list List information about probes, targets, or boards.
- pack Manage CMSIS-Packs for target support.
复制代码
通过subcommand知道,pyOCD的子命令有cmd、erase、flash、reset、gdb、json、list和pack。下面对这些命令作简要的介绍。
三、擦除命令erase
输入帮助命令可以查看到如下信息:
- C:\Users\86188\Desktop> pyocd erase --help
- usage: pyocd erase [-h] [-v] [-q] [-j PATH] [--config PATH] [--no-config] [--script PATH] [-O OPTION=VALUE]
- [-da DAPARG [DAPARG ...]] [--pack PATH] [-u UNIQUE_ID] [-b BOARD] [-t TARGET] [-f FREQUENCY] [-W]
- [-M MODE] [-c] [-s] [--mass]
- [<sector-address> [<sector-address> ...]]
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose More logging. Can be specified multiple times.
- -q, --quiet Less logging. Can be specified multiple times.
- configuration:
- -j PATH, --dir PATH Set the project directory. Defaults to the directory where pyocd was run.
- --config PATH Specify YAML configuration file. Default is pyocd.yaml or pyocd.yml.
- --no-config Do not use a configuration file.
- --script PATH Use the specified user script. Defaults to pyocd_user.py.
- -O OPTION=VALUE Set named option.
- -da DAPARG [DAPARG ...], --daparg DAPARG [DAPARG ...]
- Send setting to DAPAccess layer.
- --pack PATH Path to a CMSIS Device Family Pack.
- connection:
- -u UNIQUE_ID, --uid UNIQUE_ID, --probe UNIQUE_ID
- Choose a probe by its unique ID or a substring thereof.
- -b BOARD, --board BOARD
- Set the board type (not yet implemented).
- -t TARGET, --target TARGET
- Set the target type.
- -f FREQUENCY, --frequency FREQUENCY
- SWD/JTAG clock frequency in Hz. Accepts a float or int with optional case-insensitive K/M
- suffix and optional Hz. Examples: "1000", "2.5khz", "10m".
- -W, --no-wait Do not wait for a probe to be connected if none are available.
- -M MODE, --connect MODE
- Select connect mode from one of (halt, pre-reset, under-reset, attach).
- erase options:
- -c, --chip Perform a chip erase.
- -s, --sector Erase the sectors listed as positional arguments.
- --mass Perform a mass erase. On some devices this is different than a chip erase.
- <sector-address> List of sector addresses or ranges to erase.
- If no position arguments are listed, then no action will be taken unless the --chip or --mass-erase options are
- provided. Otherwise, the positional arguments should be the addresses of flash sectors or address ranges. The end
- address of a range is exclusive, meaning that it will not be erased. Thus, you should specify the address of the
- sector after the last one to be erased. If a '+' is used instead of '-' in a range, this indicates that the second
- value is a length rather than end address. Examples: 0x1000 (erase single sector starting at 0x1000) 0x800-0x2000
- (erase sectors starting at 0x800 up to but not including 0x2000) 0+8192 (erase 8 kB starting at address 0)
复制代码
这个帮助信息里面有几个信息:usage、optional argument、configuration、connection、erase options。usage是基本使用方法介绍,里面详细标注pyocd erase可以带哪些类型的参数;optional argument是一些帮助信息等;configuration是一些配置信息,比如工程路径、软件包路径等信息;connection是一些连接的信息,比如探针ID、板对象、目标对象、SWD/JTAG通信频率和连接模式等信息;erase options是擦除相关的参数,里面有chip(擦除全部存储空间)、sector(擦除程序使用的空间)、mass。最简单的命令要包含connection和erase option,也就是操作对象的操作方法。下面列举一些擦除的操作:
- 擦除全部存储空间
- pyocd erase --chip --target stm32f103rc
- 擦除程序使用的空间
- pyocd erase --sector --target stm32f103rc
- mass擦除
- pyocd erase --mass --target stm32f103rc
复制代码
虽然可以用-c代替--chip,-t代替--target,也就是pyocd erase -c -t stm32f103rc。看起来简洁很多,但是这种非常不具备可读性,不建议这样干。下面是操作的执行结果:
- C:\Users\86188\Desktop\test> pyocd erase --chip --target stm32f103rc
- 0001520:INFO:eraser:Erasing chip...
- 0001612:INFO:eraser:Done
复制代码
四、烧录命令flash
输入帮助命令可以查看到如下信息:
- C:\Users\86188\Desktop\test> pyocd flash --help
- usage: pyocd flash [-h] [-v] [-q] [-j PATH] [--config PATH] [--no-config] [--script PATH] [-O OPTION=VALUE]
- [-da DAPARG [DAPARG ...]] [--pack PATH] [-u UNIQUE_ID] [-b BOARD] [-t TARGET] [-f FREQUENCY] [-W]
- [-M MODE] [-e {auto,chip,sector}] [-a ADDR] [--trust-crc] [--format {bin,hex,elf}] [--skip BYTES]
- PATH
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose More logging. Can be specified multiple times.
- -q, --quiet Less logging. Can be specified multiple times.
- configuration:
- -j PATH, --dir PATH Set the project directory. Defaults to the directory where pyocd was run.
- --config PATH Specify YAML configuration file. Default is pyocd.yaml or pyocd.yml.
- --no-config Do not use a configuration file.
- --script PATH Use the specified user script. Defaults to pyocd_user.py.
- -O OPTION=VALUE Set named option.
- -da DAPARG [DAPARG ...], --daparg DAPARG [DAPARG ...]
- Send setting to DAPAccess layer.
- --pack PATH Path to a CMSIS Device Family Pack.
- connection:
- -u UNIQUE_ID, --uid UNIQUE_ID, --probe UNIQUE_ID
- Choose a probe by its unique ID or a substring thereof.
- -b BOARD, --board BOARD
- Set the board type (not yet implemented).
- -t TARGET, --target TARGET
- Set the target type.
- -f FREQUENCY, --frequency FREQUENCY
- SWD/JTAG clock frequency in Hz. Accepts a float or int with optional case-insensitive K/M
- suffix and optional Hz. Examples: "1000", "2.5khz", "10m".
- -W, --no-wait Do not wait for a probe to be connected if none are available.
- -M MODE, --connect MODE
- Select connect mode from one of (halt, pre-reset, under-reset, attach).
- flash options:
- -e {auto,chip,sector}, --erase {auto,chip,sector}
- Choose flash erase method. Default is sector.
- -a ADDR, --base-address ADDR
- Base address used for the address where to flash a binary. Defaults to start of flash.
- --trust-crc Use only the CRC of each page to determine if it already has the same data.
- --format {bin,hex,elf}
- File format. Default is to use the file's extension.
- --skip BYTES Skip programming the first N bytes. This can only be used with binary files.
- PATH File to program into flash.
复制代码
通过flash options知道可以烧录三种格式的文件:hex、bin和elf,其中bin和elf不带地址信息,需要在参数指定烧录起始地址。下面列举一些烧录的操作:
- 不擦除芯片,单纯烧录hex
- pyocd flash --target stm32f103rc template.hex
- 先擦除,再烧录hex
- pyocd flash --erase chip --target stm32f103rc template.hex
- 先擦除,再烧录bin,指定起始地址为0x8000000
- pyocd flash -erase chip --target stm32f103rc --base-address 0x8000000 template.bin
复制代码
一般烧录前需要擦除要烧录的区域,因为ROM的特性,只能通过擦除才能写1。下面是操作的执行结果:
- C:\Users\86188\Desktop\test> pyocd flash --erase chip --target stm32f103rc template.hex
- [====================] 100%
- 0002818:INFO:loader:Erased chip, programmed 10240 bytes (5 pages), skipped 0 bytes (0 pages) at 13.31 kB/s
复制代码
五、复位命令reset
输入帮助命令可以查看到如下信息:
- C:\Users\86188\Desktop\test> pyocd reset --help
- usage: pyocd reset [-h] [-v] [-q] [-j PATH] [--config PATH] [--no-config] [--script PATH] [-O OPTION=VALUE]
- [-da DAPARG [DAPARG ...]] [--pack PATH] [-u UNIQUE_ID] [-b BOARD] [-t TARGET] [-f FREQUENCY] [-W]
- [-M MODE] [-m METHOD]
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose More logging. Can be specified multiple times.
- -q, --quiet Less logging. Can be specified multiple times.
- configuration:
- -j PATH, --dir PATH Set the project directory. Defaults to the directory where pyocd was run.
- --config PATH Specify YAML configuration file. Default is pyocd.yaml or pyocd.yml.
- --no-config Do not use a configuration file.
- --script PATH Use the specified user script. Defaults to pyocd_user.py.
- -O OPTION=VALUE Set named option.
- -da DAPARG [DAPARG ...], --daparg DAPARG [DAPARG ...]
- Send setting to DAPAccess layer.
- --pack PATH Path to a CMSIS Device Family Pack.
- connection:
- -u UNIQUE_ID, --uid UNIQUE_ID, --probe UNIQUE_ID
- Choose a probe by its unique ID or a substring thereof.
- -b BOARD, --board BOARD
- Set the board type (not yet implemented).
- -t TARGET, --target TARGET
- Set the target type.
- -f FREQUENCY, --frequency FREQUENCY
- SWD/JTAG clock frequency in Hz. Accepts a float or int with optional case-insensitive K/M
- suffix and optional Hz. Examples: "1000", "2.5khz", "10m".
- -W, --no-wait Do not wait for a probe to be connected if none are available.
- -M MODE, --connect MODE
- Select connect mode from one of (halt, pre-reset, under-reset, attach).
- reset options:
- -m METHOD, --method METHOD
- Reset method to use ('hw', 'sw', and others). Default is 'hw'.
复制代码
从reset options知道复位有2种方式:sw(软复位)、hw(硬复位),区别就是hw是通过拉低目标芯片的reset引脚来让芯片产生硬件复位。下面列举一些复位的操作:
- 软复位
- pyocd reset --method sw --target stm32f103rc
- 硬复位
- pyocd reset -method hw --target stm32f103rc
复制代码
下面是操作的执行结果:
- C:\Users\86188\Desktop\test> pyocd reset --method sw --target stm32f103rc
复制代码
六、列表命令list
输入帮助命令可以查看到如下信息:
- C:\Users\86188\Desktop\test> pyocd list --help
- usage: pyocd list [-h] [-v] [-q] [-j PATH] [--config PATH] [--no-config] [--script PATH] [-O OPTION=VALUE]
- [-da DAPARG [DAPARG ...]] [--pack PATH] [-p] [-t] [-b] [-n NAME] [-r VENDOR] [-s {builtin,pack}]
- [-H]
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose More logging. Can be specified multiple times.
- -q, --quiet Less logging. Can be specified multiple times.
- configuration:
- -j PATH, --dir PATH Set the project directory. Defaults to the directory where pyocd was run.
- --config PATH Specify YAML configuration file. Default is pyocd.yaml or pyocd.yml.
- --no-config Do not use a configuration file.
- --script PATH Use the specified user script. Defaults to pyocd_user.py.
- -O OPTION=VALUE Set named option.
- -da DAPARG [DAPARG ...], --daparg DAPARG [DAPARG ...]
- Send setting to DAPAccess layer.
- --pack PATH Path to a CMSIS Device Family Pack.
- list output:
- -p, --probes List available probes.
- -t, --targets List all known targets.
- -b, --boards List all known boards.
- list options:
- -n NAME, --name NAME Restrict listing to items matching the given name. Applies to targets and boards.
- -r VENDOR, --vendor VENDOR
- Restrict listing to items whose vendor matches the given name. Applies to targets.
- -s {builtin,pack}, --source {builtin,pack}
- Restrict listing to targets from the specified source. Applies to targets.
- -H, --no-header Don't print a table header.
复制代码
下面列举一些list的操作:
- 列出可用的探针
- pyocd list --probes
- 列出所有支持的目标板
- pyocd list --targets
- 列出所有支持的开发板
- pyocd list --boards
复制代码
下面是操作结果
- C:\Users\86188\Desktop\test> pyocd list --probes
- # Probe Unique ID
- --------------------------------------------------------------------------------------
- 0 NUCLEO-F103RB [stm32f103rb] 07000001066bff303631544157112037a5a5a5a597969908
复制代码
每个探针都有唯一的ID,如果有多个探针连接到PC,可以通过ID来确定要操作那个探针连接的开发板。下面是pyOCD内置支持的芯片。
- C:\Users\86188\Desktop\test> pyocd list --targets
- Name Vendor Part Number Families Source
- -----------------------------------------------------------------------------------------------------
- cc3220sf Texas Instruments CC3220SF builtin
- cortex_m Generic CoreSightTarget builtin
- cy8c64_sysap Cypress cy8c64_sysap builtin
- cy8c64x5_cm0 Cypress cy8c64x5_cm0 builtin
- cy8c64x5_cm0_full_flash Cypress cy8c64x5_cm0_full_flash builtin
- cy8c64x5_cm4 Cypress cy8c64x5_cm4 builtin
- cy8c64x5_cm4_full_flash Cypress cy8c64x5_cm4_full_flash builtin
- cy8c64xa_cm0 Cypress cy8c64xA_cm0 builtin
- cy8c64xa_cm0_full_flash Cypress cy8c64xA_cm0_full_flash builtin
- cy8c64xa_cm4 Cypress cy8c64xA_cm4 builtin
- cy8c64xa_cm4_full_flash Cypress cy8c64xA_cm4_full_flash builtin
- cy8c64xx_cm0 Cypress cy8c64xx_cm0 builtin
- cy8c64xx_cm0_full_flash Cypress cy8c64xx_cm0_full_flash builtin
- cy8c64xx_cm0_nosmif Cypress cy8c64xx_cm0_nosmif builtin
- cy8c64xx_cm0_s25hx512t Cypress cy8c64xx_cm0_s25hx512t builtin
- cy8c64xx_cm4 Cypress cy8c64xx_cm4 builtin
- cy8c64xx_cm4_full_flash Cypress cy8c64xx_cm4_full_flash builtin
- cy8c64xx_cm4_nosmif Cypress cy8c64xx_cm4_nosmif builtin
- cy8c64xx_cm4_s25hx512t Cypress cy8c64xx_cm4_s25hx512t builtin
- cy8c6xx5 Cypress CY8C6xx5 builtin
- cy8c6xx7 Cypress CY8C6xx7 builtin
- cy8c6xx7_nosmif Cypress CY8C6xx7_nosmif builtin
- cy8c6xx7_s25fs512s Cypress CY8C6xx7_S25FS512S builtin
- cy8c6xxa Cypress CY8C6xxA builtin
- hc32f003 HDSC HC32F003 builtin
- hc32f005 HDSC HC32F005 builtin
- hc32f030 HDSC HC32F030 builtin
- hc32f072 HDSC HC32F072 builtin
- hc32f120x6 HDSC HC32F120x6TA builtin
- hc32f120x8 HDSC HC32F120x8TA builtin
- hc32f190 HDSC HC32F190 builtin
- hc32f196 HDSC HC32F196 builtin
- hc32f46x HDSC HC32F46x builtin
- hc32l072 HDSC HC32L072 builtin
- hc32l073 HDSC HC32L073 builtin
- hc32l110 HDSC HC32L110 builtin
- hc32l130 HDSC HC32L130 builtin
- hc32l136 HDSC HC32L136 builtin
- hc32l190 HDSC HC32L190 builtin
- hc32l196 HDSC HC32L196 builtin
- hc32m120 HDSC HC32M120 builtin
- k20d50m NXP K20D50M builtin
- k22f NXP K22F builtin
- k22fa12 NXP K22FA12 builtin
- k28f15 NXP K28F15 builtin
- k32l2b3 NXP K32L2B3 builtin
- k32w042s NXP K32W042S builtin
- k64f NXP K64F builtin
- k66f18 NXP K66F18 builtin
- k82f25615 NXP K82F25615 builtin
- ke15z7 NXP KE15Z7 builtin
- ke18f16 NXP KE18F16 builtin
- kinetis NXP Kinetis builtin
- kl02z NXP KL02Z builtin
- kl05z NXP KL05Z builtin
- kl25z NXP KL25Z builtin
- kl26z NXP KL26Z builtin
- kl27z4 NXP KL27Z4 builtin
- kl28z NXP KL28x builtin
- kl43z4 NXP KL43Z4 builtin
- kl46z NXP KL46Z builtin
- kl82z7 NXP KL82Z7 builtin
- kv10z7 NXP KV10Z7 builtin
- kv11z7 NXP KV11Z7 builtin
- kw01z4 NXP KW01Z4 builtin
- kw24d5 NXP KW24D5 builtin
- kw36z4 NXP KW36Z4 builtin
- kw40z4 NXP KW40Z4 builtin
- kw41z4 NXP KW41Z4 builtin
- lpc11u24 NXP LPC11U24 builtin
- lpc11xx_32 NXP LPC11XX_32 builtin
- lpc1768 NXP LPC1768 builtin
- lpc4088 NXP LPC4088 builtin
- lpc4088dm NXP LPC4088dm builtin
- lpc4088qsb NXP LPC4088qsb builtin
- lpc4330 NXP LPC4330 builtin
- lpc54114 NXP LPC54114 builtin
- lpc54608 NXP LPC54608 builtin
- lpc55s28 NXP LPC55S28 builtin
- lpc55s69 NXP LPC55S69 builtin
- lpc800 NXP LPC800 builtin
- lpc824 NXP LPC824 builtin
- m252kg6ae Nuvoton M252KG6AE builtin
- m263kiaae Nuvoton M263KIAAE builtin
- max32600 Maxim MAX32600 builtin
- max32620 Maxim MAX32620 builtin
- max32625 Maxim MAX32625 builtin
- max32630 Maxim MAX32630 builtin
- mimxrt1010 NXP MIMXRT1011xxxxx builtin
- mimxrt1015 NXP MIMXRT1015xxxxx builtin
- mimxrt1020 NXP MIMXRT1021xxxxx builtin
- mimxrt1050 NXP MIMXRT1052xxxxB_hyperflash builtin
- mimxrt1050_hyperflash NXP MIMXRT1052xxxxB_hyperflash builtin
- mimxrt1050_quadspi NXP MIMXRT1052xxxxB_quadspi builtin
- mps3_an522 Arm AN522 builtin
- mps3_an540 Arm AN540 builtin
- musca_a1 Arm MuscaA1 builtin
- musca_b1 Arm MuscaB1 builtin
- ncs36510 ONSemiconductor NCS36510 builtin
- nrf51 Nordic Semiconductor NRF51 builtin
- nrf52 Nordic Semiconductor NRF52832 builtin
- nrf52840 Nordic Semiconductor NRF52840 builtin
- rtl8195am Realtek Semiconductor RTL8195AM builtin
- s5js100 Samsung S5JS100 builtin
- stm32f051 STMicroelectronics STM32F051 builtin
- stm32f103rc STMicroelectronics STM32F103RC builtin
- stm32f412xe STMicroelectronics STM32F412xE builtin
- stm32f412xg STMicroelectronics STM32F412xG builtin
- stm32f429xg STMicroelectronics STM32F429xG builtin
- stm32f429xi STMicroelectronics STM32F429xI builtin
- stm32f439xg STMicroelectronics STM32F439xG builtin
- stm32f439xi STMicroelectronics STM32F439xI builtin
- stm32f767zi STMicroelectronics STM32F767xx builtin
- stm32l031x6 STMicroelectronics STM32L031x6 builtin
- stm32l475xc STMicroelectronics STM32L475xC builtin
- stm32l475xe STMicroelectronics STM32L475xE builtin
- stm32l475xg STMicroelectronics STM32L475xG builtin
- w7500 WIZnet W7500 builtin
复制代码
七、json命令
输入帮助命令可以查看到如下信息:
- C:\Users\86188\Desktop\test> pyocd json --help
- usage: pyocd json [-h] [-j PATH] [--config PATH] [--no-config] [--script PATH] [-O OPTION=VALUE]
- [-da DAPARG [DAPARG ...]] [--pack PATH] [-p] [-t] [-b] [-f]
- optional arguments:
- -h, --help show this help message and exit
- configuration:
- -j PATH, --dir PATH Set the project directory. Defaults to the directory where pyocd was run.
- --config PATH Specify YAML configuration file. Default is pyocd.yaml or pyocd.yml.
- --no-config Do not use a configuration file.
- --script PATH Use the specified user script. Defaults to pyocd_user.py.
- -O OPTION=VALUE Set named option.
- -da DAPARG [DAPARG ...], --daparg DAPARG [DAPARG ...]
- Send setting to DAPAccess layer.
- --pack PATH Path to a CMSIS Device Family Pack.
- json output:
- -p, --probes List available probes.
- -t, --targets List all known targets.
- -b, --boards List all known boards.
- -f, --features List available features and options.
复制代码
json命令和list命令的功能差不多,只不过json命令的数据输出格式是按照标准的json格式。下面列举一些json的操作:
- 以json格式列出可用的探针
- pyocd json --probes
- 以json格式列出所有支持的目标板
- pyocd json --targets
- 以json格式列出所有支持的开发板
- pyocd json --boards
- 以json格式列出所有支持的开发板
- pyocd json --features
复制代码
下面是一些执行结果:
- C:\Users\86188\Desktop\test> pyocd json --targets
- {
- "pyocd_version": "0.27.2",
- "version": {
- "major": 1,
- "minor": 2
- },
- "status": 0,
- "targets": [
- {
- "name": "mps3_an522",
- "vendor": "Arm",
- "part_families": [],
- "part_number": "AN522",
- "source": "builtin"
- },
- {
- "name": "mps3_an540",
- "vendor": "Arm",
- "part_families": [],
- "part_number": "AN540",
- "source": "builtin"
- },
- {
- "name": "cortex_m",
- "vendor": "Generic",
- "part_families": [],
- "part_number": "CoreSightTarget",
- "source": "builtin"
- },
复制代码
八、软件包命令pack
输入帮助命令可以查看到如下信息:
- C:\Users\86188\Desktop\test> pyocd pack --help
- usage: pyocd pack [-h] [-v] [-q] [-c] [-u] [-s] [-f GLOB] [-i GLOB] [-n] [-H]
- optional arguments:
- -h, --help show this help message and exit
- -v, --verbose More logging. Can be specified multiple times.
- -q, --quiet Less logging. Can be specified multiple times.
- pack operations:
- -c, --clean Erase all stored pack information.
- -u, --update Update the pack index.
- -s, --show Show the list of installed packs.
- -f GLOB, --find GLOB Report pack(s) in the index containing matching device part numbers.
- -i GLOB, --install GLOB
- Download and install pack(s) containing matching device part numbers.
- pack options:
- -n, --no-download Just list the pack(s) that would be downloaded, don't actually download anything.
- -H, --no-header Don't print a table header.
复制代码
这个是软件包的管理操作命令,可以显示软件包的信息也可以下载软件包。但是实际上,下载软件包的时候总是出现服务器没有响应的情况,估计是服务器不在国内。所以这个功能还是比较鸡肋的,幸好pyOCD内置支持不少芯片。
如果芯片刚好不是内置支持的芯片,那就需要自己找对于的软件包。比如芯片是gd32f103c8,可以自己去找GigaDevice.GD32F10x_DFP.2.0.2.pack,然后使用的时候带上--pack参数指定pack包的路径即可。比如下面操作:
- pyocd flash --erase chip --target gd32f103c8 --pack=./GigaDevice.GD32F10x_DFP.2.0.2.pack template.hex
复制代码
九、cmd命令
输入帮助命令可以查看到如下信息:
- <blockquote>C:\Users\86188\Desktop> pyocd cmd --help
复制代码
从commander options,可以知道--halt这个命令被标记为弃用,也就是不建议使用。--command命令里面有其他操作,可以输入帮助信息查看:
- C:\Users\86188\Desktop\test> pyocd cmd --command help
- Commands:
- --------
- break ADDR Set a breakpoint address
- cmp, compare ADDR [LEN] FILENAME Compare a memory range against a binary file.
- core [NUM] Select CPU core by number or print selected core
- d, disasm [-c/--center] ADDR [LEN] Disassemble instructions at an address
- erase [ADDR] [COUNT] Erase internal flash sectors (performs mass erase if no arguments given)
- exit, quit Quit pyocd-tool
- fill [SIZE] ADDR LEN PATTERN Fill a range of memory with a pattern
- find ADDR LEN BYTE... Search for a value in memory within the given address range.
- gdbserver ACTION Start or stop the gdbserver.
- c, continue, g, go Resume execution of the target
- h, halt Halt the target
- ?, help [CMD] Show help for commands
- initdp Init DP and power up debug.
- list Show available targets
- load FILENAME [ADDR] Load a binary, hex, or elf file with optional base address
- loadmem ADDR FILENAME Load a binary file to an address in memory (RAM or flash)
- lsbreak List breakpoints
- lswatch List watchpoints
- makeap APSEL Creates a new AP object for the given APSEL.
- r16, read16, rh ADDR [LEN] Read 16-bit halfwords
- r32, read32, rw ADDR [LEN] Read 32-bit words
- r, rb, read, read8 ADDR [LEN] Read 8-bit bytes
- rap, readap [APSEL] ADDR Read AP register
- rdp, readdp ADDR Read DP register
- reg [-f] [REG] Print core or peripheral register(s).
- reinit Reinitialize the target object
- reset [-h/--halt] Reset the target
- rmbreak ADDR Remove a breakpoint
- rmwatch ADDR Remove a watchpoint
- savemem ADDR LEN FILENAME Save a range of memory to a binary file
- set NAME VALUE Set an option value
- show INFO Report info about the target
- st, stat, status Show the target's current state
- s, step Step one instruction
- symbol NAME Show a symbol's value.
- unlock Unlock security on the target
- watch ADDR [r|w|rw] [1|2|4] Set a watchpoint address, and optional access type (default rw) and size (4).
- where [ADDR] Show symbol, file, and line for address.
- wreg [-r] REG VALUE Set the value of a core or peripheral register.
- w16, wh, write16 ADDR DATA... Write 16-bit halfwords to memory (RAM or flash). The address may be unaligned. Flash writes are subject to minimum write size and alignment.
- w32, write32, ww ADDR DATA... Write 32-bit words to memory (RAM or flash). The address may be unaligned. Flash writes are subject to minimum write size and alignment.
- w, wb, write, write8 ADDR DATA... Write 8-bit bytes to memory (RAM or flash). Flash writes are subject to minimum write size and alignment.
- wap, writeap [APSEL] ADDR DATA Write AP register
- wdp, writedp ADDR DATA Write DP register
- All register names are also available as commands that print the register's value.
- Any ADDR or LEN argument will accept a register name.
- Prefix line with $ to execute a Python expression.
- Prefix line with ! to execute a shell command.
- Info:
- ----
- cores Information about CPU cores in the target.
- fault Fault status information.
- graph Print the target object graph.
- hnonsec Display the current HNONSEC value used by the selected MEM-AP.
- hprot Display the current HPROT value used by the selected MEM-AP.
- locked Report whether the target is locked.
- map Target memory map.
- mem-ap Display the currently selected MEM-AP used for memory read/write commands.
- nreset Current nRESET signal state.
- option Show the current value of one or more user options.
- peripherals List of target peripheral instances.
- si, step-into-interrupt Display whether interrupts are enabled when single stepping.
- target General target information.
- uid Target's unique ID
- vc, vector-catch Show current vector catch settings.
- Options:
- -------
- clock Set SWD or JTAG clock frequency in Hertz. A case-insensitive metric scale suffix of either 'k' or 'm' is allowed, as well as a trailing "Hz". There must be no space between the frequency and the suffix. For example, "2.5MHz" sets the clock to 2.5 MHz.
- hnonsec Set the current HNONSEC value used by the selected MEM-AP.
- hprot Set the current HPROT value used by the selected MEM-AP.
- log Set log level to one of debug, info, warning, error, critical
- mem-ap Select the MEM-AP used for memory read/write commands.
- nreset Set nRESET signal state. Accepts a value of 0 or 1.
- option Change the value of one or more user options.
- si, step-into-interrupt Set whether to enable or disable interrupts when single stepping. Set to 1 to enable.
- vc, vector-catch Control enabled vector catch sources.
复制代码
这里面的指令就比较多了,都是一些芯片调试相关的。下面列举一些操作:
- 加载hex文件
- pyocd cmd --command load template.hex --target stm32f103rc
- 复位芯片
- pyocd cmd --command reset --target stm32f103rc
- 擦除芯片
- pyocd cmd --command erase --target stm32f103rc
- 芯片暂停(然后就可用操作单步、打断点等)
- pyocd cmd --connect halt --target stm32f103rc
- 设置断点
- pyocd cmd --command break 0x0800029e --target stm32f103rc
- 单步运行
- pyocd cmd --command step --target stm32f103rc
- 恢复执行
- pyocd cmd --command go --target stm32f103rc
- 查询芯片当前状态
- pyocd cmd --command status --target stm32f103rc
- 读取4个字节
- pyocd cmd --command read32 0x40010c00 12 --connect attach --target stm32f103rc
- 打印内核或者外设寄存器
- pyocd cmd --command reg --connect attach --target stm32f103rc
复制代码
这些指令主要是电脑端GDB和pyOCD的GDB Service交互用的。当然自己也可以试着调试,一般调试都要先让芯片halt(暂停),然后才能插入断点、单步、读写寄存器、读写内存等操作。下面是一些简单的调试过程:
- C:\Users\86188\Desktop\test> pyocd cmd --command load template.hex --target stm32f103rc
- [====================] 100%
- PS C:\Users\86188\Desktop\test> pyocd cmd --connect halt --target stm32f103rc
- Connected to STM32F103RC [Halted]: 07000001066bff303631544157112037a5a5a5a597969908
- pyocd> step
- PC = 0x080015de
- pyocd> step
- PC = 0x080004ce
- pyocd> break 0x080004ce
- Set breakpoint at 0x080004ce
- pyocd> status
- Core 0: Halted
- pyocd> reg
- r0: 0x080004cf r6: 0x00000000 r12: 0x00000001
- r1: 0x40022000 r7: 0x00000000 sp: 0x20001788
- r2: 0x00000001 r8: 0x00000000 lr: 0x080015e1
- r3: 0x7a6a5aa8 r9: 0x20000200 pc: 0x080004ce
- r4: 0x00000000 r10: 0x08002504 xpsr: 0x01000000
- r5: 0x20001124 r11: 0x00000000 primask: 0x00000000
- pyocd> go
- Device is halted; a debug event may have occurred
- pyocd> lsbreak
- 5 hardware breakpoints available
- 0: 0x080004ce
- pyocd> rmbreak 0x080004ce
- Removed breakpoint at 0x080004ce
- pyocd> go
- Successfully resumed device
- pyocd> status
- Core 0: Running
- pyocd>
复制代码
先把程序load到芯片,然后让芯片halt下来,再单步、打断点、查看芯片状态、查看寄存器、查看断点、移除断点、全速运行、查看状态。一般用keil或者IAR,只需要点击几个图案就能完成芯片调试的操作,只能说明keil太方便了。这里是纯粹用命令行控制,虽然难度增加了不少,但是对调试器的原理和功能会多点认识,这就是进步吧。后面再配合GDB,就能用GDB的方式调试代码了。
本来这篇介绍应该在下午完成,但是出了点意外。我习惯在51平台网页在线编辑,一不小心按了ctrl+A+Delete,全部删了。想要撤销操作,按了ctrl+Z,居然不支持,更坑的地方是网页默认30秒保存,当时就剩下几秒时间,来不及操作,就被覆盖保存。点击恢复,出现自动保存的空白页面。急忙联系网站负责人,还是没有找回资料。白白浪费了3个小时。没办法晚上再花了3个半小时,重新码字,总算完成。这个经历给了一个教训:一定要在本地保存!
如果感觉这篇介绍对你有帮助,请支持一下。有任何疑问,欢迎留言讨论!