打印
[经验分享]

开源pyOCD的使用介绍

[复制链接]
1095|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
youtome|  楼主 | 2024-1-21 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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的方式调试代码了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

3722

帖子

2

粉丝