parent
3a2f0d4c2e
commit
a8c114b7f5
|
@ -22,7 +22,7 @@ PyOCD 通过 --pack 指定 .pack 文件。
|
||||||
pyocd erase --chip --target stm32f103rc
|
pyocd erase --chip --target stm32f103rc
|
||||||
```
|
```
|
||||||
|
|
||||||
如果需要指定国产新,则需要结合 --pack 参数,例如:
|
如果需要指定国产芯片,则需要结合 --pack 参数,例如:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pyocd erase --chip --target n32l406cb --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
pyocd erase --chip --target n32l406cb --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
||||||
|
@ -34,7 +34,7 @@ pyocd erase --chip --target n32l406cb --pack <"/Path/To/Nationstech.N32L40x_DFP.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 擦除整个芯片
|
# 擦除整个芯片
|
||||||
pyocd erase --chip --target <Target Chip Name> --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
pyocd erase --chip --target <Target Chip Name> --pack <"/Path/to/PackFile.pack">
|
||||||
```
|
```
|
||||||
|
|
||||||
## 5. 烧写芯片
|
## 5. 烧写芯片
|
||||||
|
@ -42,7 +42,7 @@ pyocd erase --chip --target <Target Chip Name> --pack <"/Path/To/Nationstech.N32
|
||||||
使用 load 命令烧写新,需要指定烧写的起始地址和要烧写的程序。load 命令会自动擦除 Flash 并校验,可以指定擦除和校验方法。
|
使用 load 命令烧写新,需要指定烧写的起始地址和要烧写的程序。load 命令会自动擦除 Flash 并校验,可以指定擦除和校验方法。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pyocd.exe load --trust-crc --base-address <Program Start Address> <"/Path/To/Program.hex"> --target <Target Chip Name> --frequency {Examples: "1000", "2.5khz", "10m"} --erase {auto,chip,sector} --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
pyocd.exe load --trust-crc --base-address <Program Start Address> <"/Path/To/Program.hex"> --target <Target Chip Name> --frequency {Examples: "1000", "2.5khz", "10m"} --erase {auto,chip,sector} --pack <"/Path/to/PackFile.pack">
|
||||||
```
|
```
|
||||||
|
|
||||||
## 6. GDB Server 调试
|
## 6. GDB Server 调试
|
||||||
|
@ -50,7 +50,7 @@ pyocd.exe load --trust-crc --base-address <Program Start Address> <"/Path/To/Pro
|
||||||
使用 gdbserver 命令启动 gdbserver 服务,然后可以使用 gdb 客户端进行连接调试。
|
使用 gdbserver 命令启动 gdbserver 服务,然后可以使用 gdb 客户端进行连接调试。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pyocd gdbserver --port 50000 --telnet-port 50001 --target <Target Chip Name> --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
pyocd gdbserver --port 50000 --telnet-port 50001 --target <Target Chip Name> --pack <"/Path/to/PackFile.pack">
|
||||||
```
|
```
|
||||||
|
|
||||||
## 7. RTT 控制
|
## 7. RTT 控制
|
||||||
|
@ -75,10 +75,10 @@ SEGGER_RTT_printf(0, "Hello\r\n");
|
||||||
|
|
||||||
进行打印。
|
进行打印。
|
||||||
|
|
||||||
该方法不但支持 Jtag,还支持 CMSIS-DAP/DAPLink 等调试器。
|
该方法不但支持 JTAG,还支持 CMSIS-DAP/DAPLink 等调试器。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pyocd.exe rtt --target <Target Chip Name> --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
pyocd.exe rtt --target <Target Chip Name> --pack <"/Path/to/PackFile.pack">
|
||||||
```
|
```
|
||||||
|
|
||||||
其他参数:
|
其他参数:
|
||||||
|
|
|
@ -16,12 +16,15 @@ published: true
|
||||||
- [1.2. 项目配置](#12-项目配置)
|
- [1.2. 项目配置](#12-项目配置)
|
||||||
- [1.3. 编译和下载](#13-编译和下载)
|
- [1.3. 编译和下载](#13-编译和下载)
|
||||||
- [2. 调试](#2-调试)
|
- [2. 调试](#2-调试)
|
||||||
|
- [2.1. 基本调试](#21-基本调试)
|
||||||
|
- [2.2. ARMCC 编译器的额外调试配置](#22-armcc-编译器的额外调试配置)
|
||||||
|
- [2.3. 使用 RTT](#23-使用-rtt)
|
||||||
- [3. 国产芯片及 CMSIS-DAP 调试器的支持](#3-国产芯片及-cmsis-dap-调试器的支持)
|
- [3. 国产芯片及 CMSIS-DAP 调试器的支持](#3-国产芯片及-cmsis-dap-调试器的支持)
|
||||||
- [3.1. PyOCD 的安装](#31-pyocd-的安装)
|
- [3.1. PyOCD 的安装](#31-pyocd-的安装)
|
||||||
- [3.2. 关于 PyOCD 的扩展说明](#32-关于-pyocd-的扩展说明)
|
- [3.2. 关于 PyOCD 的扩展说明](#32-关于-pyocd-的扩展说明)
|
||||||
- [3.3 PyOCD 常用命令](#33-pyocd-常用命令)
|
- [3.3 PyOCD 常用命令](#33-pyocd-常用命令)
|
||||||
- [4. 常见问题解决](#4-常见问题解决)
|
- [4. 常见问题解决](#4-常见问题解决)
|
||||||
- [4.1. GCC 链接错误 引用未定义函数 \_read \_write \_sbrk](#41-gcc-链接错误-引用未定义函数-_read-_write-_sbrk)
|
- [4.1. GCC 链接错误 引用未定义函数 \_read、\_write、\_sbrk](#41-gcc-链接错误-引用未定义函数-_read_write_sbrk)
|
||||||
- [5. 外部参考资料](#5-外部参考资料)
|
- [5. 外部参考资料](#5-外部参考资料)
|
||||||
|
|
||||||
VSCode 的嵌入式开发插件具备了相当多的功能,这里主要使用 Embedded IDE,这是一个支持 MCU 开发的工具,其优势是可以通过 pack 包来添加芯片,降低了国产芯片开发环境配置的难度。
|
VSCode 的嵌入式开发插件具备了相当多的功能,这里主要使用 Embedded IDE,这是一个支持 MCU 开发的工具,其优势是可以通过 pack 包来添加芯片,降低了国产芯片开发环境配置的难度。
|
||||||
|
@ -96,12 +99,109 @@ GCC 需要配置“Linker Script File Path”,这个是 LD 连接文件,该
|
||||||
|
|
||||||
## 2. 调试
|
## 2. 调试
|
||||||
|
|
||||||
Embedded IDE 不具备调试功能,需要 Cortex-Debug 扩展插件。Cortex-Debug 可以与 EIDE 进行很好的配合,一般不需要进行额外的配置。当变更 EIDE 的“Flasher”后即会自动生成 VSCode 调试脚本。然后按 F5 进行调试即可。
|
Embedded IDE 不具备调试功能,需要 Cortex-Debug 扩展插件。Cortex-Debug 可以与 EIDE 进行很好的配合,只需要极少的额外的配置。
|
||||||
|
|
||||||
Cortex-Debug 会自动安装 RTOS Views 以及其他一些依赖插件,如果提示自动安装,点击允许即可。
|
Cortex-Debug 会自动安装 RTOS Views 以及其他一些依赖插件,如果提示自动安装,点击允许即可。
|
||||||
|
|
||||||
RTOS Views 支持 RTOS 调试功能,比如查看系统中的 Task 等。
|
RTOS Views 支持 RTOS 调试功能,比如查看系统中的 Task 等。
|
||||||
|
|
||||||
|
### 2.1. 基本调试
|
||||||
|
|
||||||
|
进入 VSCode 的 “Run and Debug”页面,创建或修改“launch.json”调试文件。
|
||||||
|
|
||||||
|
一个基于 JLink 的调试配置如下:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "jlink",
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"executable": "./build/Debug/<debug file name>.elf",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "cortex-debug",
|
||||||
|
"runToEntryPoint": "main",
|
||||||
|
"servertype": "jlink",
|
||||||
|
"device": <"Target Chip Name">,
|
||||||
|
"cmsisPack": "/Path/to/PackFile.pack",
|
||||||
|
"svdFile": "/Path/to/SystemViewDescriptionFile.svd"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
一个基于 PyOCD 的调试配置文件如下:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "pyocd",
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"executable": "./build/Debug/<debug file name>.elf",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "cortex-debug",
|
||||||
|
"runToEntryPoint": "main",
|
||||||
|
"servertype": "pyocd",
|
||||||
|
"toolchainPrefix": "arm-none-eabi",
|
||||||
|
"targetId": <"Target Chip Name">,
|
||||||
|
"cmsisPack": "/Path/to/PackFile.pack",
|
||||||
|
"svdFile": "/Path/to/SystemViewDescriptionFile.svd"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- executable:带有调试符号的编译结果文件,如果是 AXF 文件,需要转换为 ELF 文件再使用,方法可以参考 [2.2. ARMCC 编译器的额外调试配置](#22-armcc-编译器的额外调试配置);
|
||||||
|
- runToEntryPoint:相当于“运行到 main 函数停止”功能;
|
||||||
|
- servertype:jlink、pyocd、stlink、openocd 等;
|
||||||
|
- toolchainPrefix:使用 ARM GCC 编译器及调试器的,需要将此字段设置为 "arm-none-eabi";
|
||||||
|
- device:jlink 使用此字段设置芯片型号,如 STM32F429BI;
|
||||||
|
- targetId:pyocd 使用此字段设置芯片型号,如 STM32F429BITx;
|
||||||
|
- cmsisPack:要使用的 pack 文件,如果使用 EIDE 自带的 pack 文件,其默认下载在 “\<User\>/.eide/pack/cmsis” 目录下;
|
||||||
|
- svdFile:即 System View Description 文件,指定该文件才可以在调试时查看设备寄存器,如果使用 EIDE,通常在 “.pack” 文件夹下,如 ".pack/Keil/STM32F4xx_DFP.2.14.0/CMSIS/SVD/STM32F429x.svd" 或 ".pack/Nationstech/N32L40x_DFP.0.9.0/svd/N32L406.svd"。
|
||||||
|
|
||||||
|
### 2.2. ARMCC 编译器的额外调试配置
|
||||||
|
|
||||||
|
由于 Cortex-Debug 的后端调试器为 GDB,调试文件为 ELF 格式,而 ARMCC 的编译结果为 AXF 文件。如果直接调试 AXF 文件将导致错误。解决方法为:使用工具将 AXF 文件转换为 ELF 文件即可。这个转换过程是自动完成的,可以在 VSCode 配置的 EIDE 配置中实现。
|
||||||
|
|
||||||
|
按 Ctrl+Shift+P,输入 “Open Settings”,进入配置页面,在搜索框中输入“EIDE AXF”,找到:“EIDE.ARM.Option: Axf To Elf”选项并勾选。重新编项目,EIDE 自动将 .axf 文件转换到 .elf 文件。
|
||||||
|
|
||||||
|
![Axf To Elf](./img/VSCode_ARM_CortexM_开发/010.png)
|
||||||
|
|
||||||
|
### 2.3. 使用 RTT
|
||||||
|
|
||||||
|
如果使用的是 JLink 调试器,Cortex-Debug 可以在调试时自动调出 RTT 输出窗口,配置方法为:在“launch.json”调试文件的“configurations”字段中增加:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"rttConfig": {
|
||||||
|
"enabled": true,
|
||||||
|
"address": "auto",
|
||||||
|
"decoders": [
|
||||||
|
{
|
||||||
|
"label": "rtt0",
|
||||||
|
"port": 0,
|
||||||
|
"type": "console"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
CMSIS-DAP 等调试器也支持 RTT 功能,可以使用 PyOCD 的 rtt 命令来查看调试器的 RTT 输出:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pyocd.exe rtt --target <Target Chip Name> --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack">
|
||||||
|
```
|
||||||
|
|
||||||
|
截止目前(2024年,版本 0.36.0),PyOCD 无法支持 GDB Server 和 RTT 功能的同时使用,官方有同时使能该功能的计划,并在 2022 年有所[讨论](https://github.com/pyocd/pyOCD/issues/1439),但尚未见该功能完成,讨论也仍处于 Open 状态。
|
||||||
|
|
||||||
## 3. 国产芯片及 CMSIS-DAP 调试器的支持
|
## 3. 国产芯片及 CMSIS-DAP 调试器的支持
|
||||||
|
|
||||||
通常国产芯片会提供 Keil 的 pack 文件,以及 JTAG 扩展支持该芯片的方法。因此如果使用 Keil+DAP 或者使用 EIDE+JTAG 均可下载和调试。但使用 EIDE+DAP 就需要变通一下,因为 EIDE 所支持的调试器中并没有 Keil 中的 CMSIS-DAP 选项,只有 OpenOCD 和 PyOCD。而想让 OpenOCD 支持某款芯片就要编写该芯片的 Flash 算法,这个方法有些复杂。
|
通常国产芯片会提供 Keil 的 pack 文件,以及 JTAG 扩展支持该芯片的方法。因此如果使用 Keil+DAP 或者使用 EIDE+JTAG 均可下载和调试。但使用 EIDE+DAP 就需要变通一下,因为 EIDE 所支持的调试器中并没有 Keil 中的 CMSIS-DAP 选项,只有 OpenOCD 和 PyOCD。而想让 OpenOCD 支持某款芯片就要编写该芯片的 Flash 算法,这个方法有些复杂。
|
||||||
|
@ -199,7 +299,7 @@ pyocd pack install <part number>
|
||||||
|
|
||||||
## 4. 常见问题解决
|
## 4. 常见问题解决
|
||||||
|
|
||||||
### 4.1. GCC 链接错误 引用未定义函数 _read _write _sbrk
|
### 4.1. GCC 链接错误 引用未定义函数 _read、_write、_sbrk
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r':
|
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r':
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Loading…
Reference in New Issue