diff --git a/Software/Applications/PyOCD/PyOCD_的基本使用.md b/Software/Applications/PyOCD/PyOCD_的基本使用.md index 1630ec9..f2cba13 100644 --- a/Software/Applications/PyOCD/PyOCD_的基本使用.md +++ b/Software/Applications/PyOCD/PyOCD_的基本使用.md @@ -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 --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack"> +pyocd erase --chip --target --pack <"/Path/to/PackFile.pack"> ``` ## 5. 烧写芯片 @@ -42,7 +42,7 @@ pyocd erase --chip --target --pack <"/Path/To/Nationstech.N32 使用 load 命令烧写新,需要指定烧写的起始地址和要烧写的程序。load 命令会自动擦除 Flash 并校验,可以指定擦除和校验方法。 ```bash -pyocd.exe load --trust-crc --base-address <"/Path/To/Program.hex"> --target --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 <"/Path/To/Program.hex"> --target --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 <"/Path/To/Pro 使用 gdbserver 命令启动 gdbserver 服务,然后可以使用 gdb 客户端进行连接调试。 ```bash -pyocd gdbserver --port 50000 --telnet-port 50001 --target --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack"> +pyocd gdbserver --port 50000 --telnet-port 50001 --target --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 --pack <"/Path/To/Nationstech.N32L40x_DFP.0.9.0.pack"> +pyocd.exe rtt --target --pack <"/Path/to/PackFile.pack"> ``` 其他参数: diff --git a/Software/Applications/VSCode/VSCode_ARM_CortexM_开发.md b/Software/Applications/VSCode/VSCode_ARM_CortexM_开发.md index 992b311..4e3118c 100644 --- a/Software/Applications/VSCode/VSCode_ARM_CortexM_开发.md +++ b/Software/Applications/VSCode/VSCode_ARM_CortexM_开发.md @@ -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/.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/.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 文件,其默认下载在 “\/.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 --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 调试器的支持 通常国产芯片会提供 Keil 的 pack 文件,以及 JTAG 扩展支持该芯片的方法。因此如果使用 Keil+DAP 或者使用 EIDE+JTAG 均可下载和调试。但使用 EIDE+DAP 就需要变通一下,因为 EIDE 所支持的调试器中并没有 Keil 中的 CMSIS-DAP 选项,只有 OpenOCD 和 PyOCD。而想让 OpenOCD 支持某款芯片就要编写该芯片的 Flash 算法,这个方法有些复杂。 @@ -199,7 +299,7 @@ pyocd pack install ## 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': diff --git a/Software/Applications/VSCode/img/VSCode_ARM_CortexM_开发/010.png b/Software/Applications/VSCode/img/VSCode_ARM_CortexM_开发/010.png new file mode 100644 index 0000000..a772eda Binary files /dev/null and b/Software/Applications/VSCode/img/VSCode_ARM_CortexM_开发/010.png differ