补充调试配置并修正错误。

Signed-off-by: rick.chan <cy@haoan119.com>
This commit is contained in:
rick.chan 2024-08-05 17:15:21 +08:00
parent 3a2f0d4c2e
commit a8c114b7f5
3 changed files with 110 additions and 10 deletions

View File

@ -22,7 +22,7 @@ PyOCD 通过 --pack 指定 .pack 文件。
pyocd erase --chip --target stm32f103rc
```
如果需要指定国产,则需要结合 --pack 参数,例如:
如果需要指定国产芯片,则需要结合 --pack 参数,例如:
```bash
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
# 擦除整个芯片
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. 烧写芯片
@ -42,7 +42,7 @@ pyocd erase --chip --target <Target Chip Name> --pack <"/Path/To/Nationstech.N32
使用 load 命令烧写新需要指定烧写的起始地址和要烧写的程序。load 命令会自动擦除 Flash 并校验,可以指定擦除和校验方法。
```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 调试
@ -50,7 +50,7 @@ pyocd.exe load --trust-crc --base-address <Program Start Address> <"/Path/To/Pro
使用 gdbserver 命令启动 gdbserver 服务,然后可以使用 gdb 客户端进行连接调试。
```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 控制
@ -75,10 +75,10 @@ SEGGER_RTT_printf(0, "Hello\r\n");
进行打印。
该方法不但支持 Jtag,还支持 CMSIS-DAP/DAPLink 等调试器。
该方法不但支持 JTAG,还支持 CMSIS-DAP/DAPLink 等调试器。
```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">
```
其他参数:

View File

@ -16,12 +16,15 @@ published: true
- [1.2. 项目配置](#12-项目配置)
- [1.3. 编译和下载](#13-编译和下载)
- [2. 调试](#2-调试)
- [2.1. 基本调试](#21-基本调试)
- [2.2. ARMCC 编译器的额外调试配置](#22-armcc-编译器的额外调试配置)
- [2.3. 使用 RTT](#23-使用-rtt)
- [3. 国产芯片及 CMSIS-DAP 调试器的支持](#3-国产芯片及-cmsis-dap-调试器的支持)
- [3.1. PyOCD 的安装](#31-pyocd-的安装)
- [3.2. 关于 PyOCD 的扩展说明](#32-关于-pyocd-的扩展说明)
- [3.3 PyOCD 常用命令](#33-pyocd-常用命令)
- [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-外部参考资料)
VSCode 的嵌入式开发插件具备了相当多的功能,这里主要使用 Embedded IDE这是一个支持 MCU 开发的工具,其优势是可以通过 pack 包来添加芯片,降低了国产芯片开发环境配置的难度。
@ -58,7 +61,7 @@ EDID 也支持使用 AC5、AC6、IAR 等编译器,以及 STLink、pyOCD 等下
![工具切换](img/VSCode_ARM_CortexM_开发/004.png)
***注使用“Setup Utility Tools”安装的 GCC 包在使用时会造成 FreeRTOS 堆栈大很多TCB 中的 struct _reent xNewLib_reent 结构有问题runtime 的问题),解决办法是使用 STM32Cube IDE 中的 GCC 进行替换([点此下载](./img/VSCode_ARM_CortexM_开发/gcc_arm.zip))。***
***注使用“Setup Utility Tools”安装的 GCC 包在使用时会造成 FreeRTOS 堆栈大很多TCB 中的 struct _reent xNewLib_reent 结构有问题runtime 的问题),解决办法是使用 STM32Cube IDE 中的 GCC 进行替换([点此下载](./img/VSCode_ARM_CortexM_开发/gcc_arm.zip))。***
### 1.2. 项目配置
@ -96,12 +99,109 @@ GCC 需要配置“Linker Script File Path”这个是 LD 连接文件,该
## 2. 调试
Embedded IDE 不具备调试功能,需要 Cortex-Debug 扩展插件。Cortex-Debug 可以与 EIDE 进行很好的配合,一般不需要进行额外的配置。当变更 EIDE 的“Flasher”后即会自动生成 VSCode 调试脚本。然后按 F5 进行调试即可
Embedded IDE 不具备调试功能,需要 Cortex-Debug 扩展插件。Cortex-Debug 可以与 EIDE 进行很好的配合,只需要极少的额外的配置
Cortex-Debug 会自动安装 RTOS Views 以及其他一些依赖插件,如果提示自动安装,点击允许即可。
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 函数停止”功能;
- servertypejlink、pyocd、stlink、openocd 等;
- toolchainPrefix使用 ARM GCC 编译器及调试器的,需要将此字段设置为 "arm-none-eabi"
- devicejlink 使用此字段设置芯片型号,如 STM32F429BI
- targetIdpyocd 使用此字段设置芯片型号,如 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.0PyOCD 无法支持 GDB Server 和 RTT 功能的同时使用,官方有同时使能该功能的计划,并在 2022 年有所[讨论](https://github.com/pyocd/pyOCD/issues/1439),但尚未见该功能完成,讨论也仍处于 Open 状态。
## 3. 国产芯片及 CMSIS-DAP 调试器的支持
通常国产芯片会提供 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.1. GCC 链接错误 引用未定义函数 _read _write _sbrk
### 4.1. GCC 链接错误 引用未定义函数 _read、_write、_sbrk
```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':

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB