引言:上文介绍了CubeMX配置项目+MDKKeil开发编译下载仿真开发方式,但是很多人都很无奈原生Keil的开发环境,不支持代码补全不说而且还不支持语法高亮导致代码频繁返工。
故本文提出一种基于现代代码编辑器VsCode其插件EIDE进行开发的现代嵌入式开发模式。比起上文方式,此处把开发下载仿真工作移动到了EIDE上,即CubeMX配置项目+MDKeil编译代码+EIDE开发下载仿真的模式。
关键词:嵌入式现代开发;EIDE;VSCODE;MDK KEIL5;PyOCD;Cortex-Debug
工具关系:KeilMDK为EIDE提供AC5、AC6编译工具链;CubeMx为EIDE生成初始的项目代码;EIDE 通过CLI调用KeilMDK的编译链编译CubeMX生成的项目,并且通过Python的PyOCD与DAP-LINK通信实现基于SWD下载接口下载程序,而调试通过Cortex-Debug生成调试终端,通过PyOCD与DAP-LINK通信通过SWD接口访问芯片内部的串行线调试端口(SW-DP)*
平台条件:
硬件:
软件:
- CubeMX
- MDK Keil5
- VsCode
- Python 3.10
一、CubeMX端
引言:此工具是用来作为项目开启的第一步,生成一个初始项目目录用的。注意了,嵌入式的初始环境目录可不是单单的一个空文件夹而已,对于STM32来讲,这个空项目目录包括启动文件、HAL库或者标准库文件等,这样才算对于开发嵌入式平台来讲的一个比较完整的开发空项目目录。
(1)简介
STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。STM32CubeMX几乎覆盖了STM32 全系列芯片。
(2)安装
- 下载JRE
- 下载CubeMX
- 切换网页语言

- 选择STM32软件开发套件

- 选择STM32CubeMx

- 下载自己需要的软件

打开软件安装包

同一协议

勾选第一个即可,第二个选项是是否同意ST公司收集你的个人使用信息等。

选择安装路径

会提示安装本软件可能会与文件夹之前文件冲突,导致文件夹之前文件丢失 是否继续,点击YES即可

直接点NEXT

安装完成,点Done退出

(3)配置
- 更改CubeMx资源路径
- Help -> Updater Settings

- 资源路径

**注意:资源路径中不能有中文出现
- 配置HAL库
- 在线安装
- 打开安装好的 STM32CubeMX 软件 点上面的Help -> Manage embedded software packages

- 选择需要安装的芯片型号和版本

- 安装完成后如下图:

- 离线安装
- HAL库下载

- 直接导入安装包 Help -> Manage embedded software packages ->From Local 选择离线包即可

(4)测试
提示:此步创建的项目后面用得上,请耐心仔细
新建工程

选择芯片型号

设置调试器,默认是关闭的,如果不使用调试器关闭即可

设置外部时钟,默认是使用的内部时钟
打开外部时钟
设置时钟评率
将时钟评率设置为72MHz,有不明白的可以看STM32时钟系统的配置寄存器和源码分析

设置LED引脚

注意:此处有坑,如果想开调试的同学得先看这篇文章STM32CubeMX SYS SW JTAG配置_当cube的debug选择sw后jtag还可以使用吗-CSDN博客
设置引脚模式

设置工程

注意:ToolChain应该选择MDK-ARM,别错选成STM32CubeIDE
生成工程

// 生成文件的初始项目树
Project Resources
│
├── Application
│ ├── MDK-ARM
│ │ └── startup_stm32f103xe.s
│ ├── User
│ │ ├── Core
│ │ │ ├── main.c
│ │ │ ├── stm32f1xx_hal_msp.c
│ │ │ └── stm32f1xx_it.c
│ │ └── Drivers
│ │ ├── CMSIS
│ │ │ └── system_stm32f1xx.c
│ │ └── STM32F1xx_HAL_Driver
│ │ ├── stm32f1xx_hal_cortex.c
│ │ ├── stm32f1xx_hal_dma.c
│ │ ├── stm32f1xx_hal_exti.c
│ │ ├── stm32f1xx_hal_flash.c
│ │ ├── stm32f1xx_hal_flash_ex.c
│ │ ├── stm32f1xx_hal_gpio.c
│ │ ├── stm32f1xx_hal_gpio_ex.c
│ │ ├── stm32f1xx_hal_pwr.c
│ │ ├── stm32f1xx_hal_rcc.c
│ │ ├── stm32f1xx_hal_rcc_ex.c
│ │ ├── stm32f1xx_hal_uart.c
│ │ └── stm32f1xx_hal.c
title:文件解释
1. **Application**: 这个文件夹通常包含应用程序的所有源代码和资源。
2. **MDK-ARM**: 这个文件夹可能包含与ARM MDK(Microcontroller Development Kit)相关的文件,这是一个用于ARM微控制器开发的集成开发环境(IDE)。
3. **startup_stm32f103xe.s**: 这是启动文件,用于初始化微控制器的硬件,设置堆栈,以及跳转到C语言的`main`函数。它通常是由汇编语言编写的。
4. **User**: 这个文件夹包含用户编写的代码,通常分为几个子文件夹来组织代码。
5. **Core**: 这个子文件夹包含核心应用程序代码。
- **main.c**: 这是应用程序的入口点,通常包含`main`函数,应用程序从这里开始执行。
- **stm32f1xx_hal_msp.c**: 这个文件包含与硬件平台相关的初始化代码,如时钟、电源、GPIO等。它是HAL库的一部分,用于设置微控制器的外设。
- **stm32f1xx_it.c**: 这个文件包含中断服务例程(ISR),用于处理各种中断,如外部中断、定时器中断等。
6. **Drivers**: 这个文件夹包含驱动程序代码,用于控制和访问微控制器的外设。
7. **CMSIS**: Cortex Microcontroller Software Interface Standard,这是一个标准,用于提供与处理器无关的硬件抽象层。
- **system_stm32f1xx.c**: 这个文件提供了系统级别的功能,如系统初始化、时钟配置等。
8. **STM32F1xx_HAL_Driver**: 这个文件夹包含STM32F1系列微控制器的硬件抽象层(HAL)驱动程序。
- **stm32f1xx_hal_cortex.c**: 提供与Cortex-M3内核相关的功能,如异常处理、浮点单元支持等。
- **stm32f1xx_hal_dma.c**: 提供直接内存访问(DMA)的驱动程序,用于在内存和外设之间传输数据,无需CPU干预。
- **stm32f1xx_hal_exti.c**: 提供外部中断/事件控制器的驱动程序。
- **stm32f1xx_hal_flash.c**: 提供闪存存储器的驱动程序,用于读写微控制器的内部存储器。
- **stm32f1xx_hal_flash_ex.c**: 提供扩展的闪存存储器功能,可能包括擦除、保护等。
- **stm32f1xx_hal_gpio.c**: 提供通用输入/输出(GPIO)端口的驱动程序。
- **stm32f1xx_hal_gpio_ex.c**: 提供GPIO的扩展功能,可能包括复用功能、外部中断等。
- **stm32f1xx_hal_pwr.c**: 提供电源管理的驱动程序。
- **stm32f1xx_hal_rcc.c**: 提供时钟控制的驱动程序,用于配置微控制器的时钟系统。
- **stm32f1xx_hal_rcc_ex.c**: 提供扩展的时钟控制功能。
- **stm32f1xx_hal_uart.c**: 提供通用异步接收/发送(UART)的驱动程序,用于串行通信。
- **stm32f1xx_hal.c**: 这个文件通常包含HAL库的核心功能,可能包括一些通用的初始化和配置代码
二、MDKKEIL端
(1)简介
Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil公司由两家私人公司联合运营,分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。Keil公司制造和销售种类广泛的开发工具,包括ANSI C编译器、宏汇编程序、调试器、连接器、库管理器、固件和实时操作系统核心(real-time kernel)。有超过10万名微控制器开发人员在使用这种得到业界认可的解决方案。其Keil C51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。
MDK 即RealView MDK 或MDK-ARM(Microcontroller Development kit),是 ARM 公司收购Keil公司以后,基于uVision界面推出的针对ARM7、ARM9、Cortex-M0、Cortex-M1、Cortex-M2、Cortex-M3、Cortex-R4等ARM处理器的嵌入式软件开发工具。MDK-ARM 集成了业内最领先的技术,包括 uVision4 集成开发环境与 RealView 编译器RVCT。支持 ARM7、ARM9 和最新的Cortex-M3/M1/M0 核处理器,自动配置启动代码,集成 Flash 烧写模块,强大的 Simulation 设备模拟,性能分析等功能,与 ARM 之前的工具包 ADS 等相比,RealView 编译器的最新版本可将性能改善超过 20%。
Keil公司开发的ARM开发工具MDK,是用来开发基于ARM核的系列微控制器的嵌入式应用程序。它适合不同层次的开发者使用,包括专业的应用程序开发工程师和嵌入式软件开发的入门者。MDK包含了工业标准的Keil C编译器、宏汇编器、调试器、实时内核等组件,支持所有基于ARM的设备,能帮助工程师按照计划完成项目。
(2)安装
官方下载请参考:https://blog.csdn.net/qq_42748213/article/details/90486054
CSDN下载地址:https://download.csdn.net/download/qq_42748213/11197237
1.双击图标进行安装

2.进入安装界面——点击Next(下一步)

3.选中同意软件使用条约,点击Next(下一步)

4.选择安装路径(以D盘Keil_V5为例)——点击Next(下一步)

5.填写用户名(First name)与邮箱(E-Mail),(任意填写,以bkrc为例)——点击Next(下一步)。

6.正在安装——等待安装进度条完成

7.去掉对勾,安装完成——点击Finish(完成)

8.添加器件库安装包——双Keil.STM32F1XX_DFP.1.1.0.pack安装包(STM32F1系列,根据使用的芯片型号,添加对应的器件库包,因我们在这里所使用的是STM32F103VCT6型号的芯片,故选择添加器件库对应F1系列安装包)

9.进入添加器件库安装包界面——(此步骤自动搜寻MDK5软件安装路径)——点击Next(下一步)

10.添加器件库安装包进度条(等待进度条完成)

11.如下图所示,添加成功——点击Finish(完成)

12.双击MDK5图标,打开软件

13.进入软件选择File——Licance Management

14.复制ID号

15.双击打开注册机软件

16.粘贴ID号,选择ARM,点击Generate按钮,得到注册号并复制

17.粘贴注册号,点击添加进行注册(出现如下图步骤3所示,即代表注册成功)

(3)配置
1、点击Keil软件的小彩棒进入配置界面,点击Debug,选择“CMSIS-DAP”模式后,点击Setting进入设置页面。
2、进入Debug页面,能够看到识别到的仿真器,将端口配置为SW模式后,并对仿真器的速度和复位进行设置。
当仿真器固件版本不同时,可以在Firmware Version处查看固件版本,版本2.0时,复位设置如图所示。
3、在Flash Download页面可以对扇区擦除、程序下载后自动运行和编程算法进行设置。
(4)测试
在Keil中使用CubeMX创建好的项目模板进行测试
打开工程
图:CubeMX创建好的可供Keil MDK使用的项目
注意:编写代码时需要编写在一对注释之间,这样再次生成代码时不会被覆盖
在mian.c文件的while循环中加入以下代码
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);HAL_Delay(1000);
如下图所示:

编译下载测试
三、VsCode端
引言:EIDE插件的开发方式十分灵活,主要体现在编译、调试、下载三个嵌入式开发主要功能的软硬件工具选择上。总的来讲,他是一个指挥者,指挥这些工具模块的互相配合调用
(1)编译工具
引言:嵌入式系统主要跑二进制代码,但是编写确实C代码。为此需要通过一套工具系统把C代码转化为二进制代码。但是不同硬件平台对C编译器要求不一样,为此产生了不同的编译器。下面我们介绍EIDE可以调用的工具链的种类
0)简介
1)种类
按照开发目标类型划分
1.八位内核编译工具
1.商业编译器
1. Keil C51 (cx51)
- 特点:Keil C51 是专为8051系列单片机设计的商业编译器,提供优化的代码生成和高级调试功能。
- 支持:支持8051系列单片机,包括多种衍生型号。
- 用途:广泛用于工业控制、消费电子和其他嵌入式系统开发,尤其是在需要高性能和可靠性的应用中。
2. IAR For STM8 (iccstm8)
- 特点:IAR For STM8 是IAR Systems提供的商业编译器,专为STM8系列单片机设计,以其生成高效、可靠的代码而闻名。
- 支持:支持STM8系列单片机。
- 用途:适用于需要STM8微控制器的嵌入式系统开发,特别是在对性能和可靠性要求较高的应用中。
3. COSMIC STM8 C Compiler (cxstm8)
- 特点:COSMIC STM8 C Compiler 是专为STM8系列单片机设计的商业编译器,提供优化的代码生成和调试支持。
- 支持:支持STM8系列单片机。
- 用途:适用于需要STM8微控制器的嵌入式系统开发,特别是在性能和代码优化方面有特别需求的应用中。
2.开源编译器
1. Small Device C Compiler (sdcc)
- 特点:SDCC 是一个开源的C编译器,支持多种8位微控制器,包括8051、AVR、PIC等。
- 支持:支持多种8位微控制器架构。
- 用途:适用于需要开源解决方案的8位微控制器嵌入式系统开发,尤其是在教育、研究和个人项目中。
title:比对
- 闭源工具链通常仅支持一种系列的8bit内核,开源8bit编译工具支持较广
2. ARM内核编译工具
1. 商业编译器
- Keil MDK(Microcontroller Development Kit)
这是一个集成开发环境(IDE),专为基于 ARM Cortex-M 和 ARM Cortex-R4 系列微控制器的嵌入式应用开发而设计。
- 特点:
1. 集成开发环境:Keil MDK 提供了一个完整的开发环境,包括编辑器、编译器、调试器和项目管理工具。
2. 高性能编译器:Keil MDK 包含了 ARM Compiler 5(armcc)和 ARM Compiler 6(armclang),这些编译器能够生成高效的代码,优化性能和内存使用。
3. 广泛的微控制器支持:支持广泛的 ARM Cortex-M 和 Cortex-R 系列微控制器,以及其他供应商的 ARM 兼容微控制器。
4. 调试和仿真:集成了多种调试和仿真工具,包括 ULINK 系列仿真器和 J-Link 仿真器,支持片上调试(On-chip Debug, OCD)。
5. 代码优化:提供高级代码优化功能,包括浮点运算优化、内存使用优化等。
6. 项目管理:提供项目管理工具,方便管理复杂的项目和多个文件。
7. RTOS 和中间件支持:支持多种实时操作系统(RTOS)和中间件,方便集成到项目中。
- 支持:
1. 多种编译器选项:除了 ARM Compiler 5 和 ARM Compiler 6,Keil MDK 还支持使用 GNU Arm Embedded Toolchain。
2. 广泛的硬件支持:支持几乎所有主流的 ARM Cortex-M 和 Cortex-R 系列微控制器,包括但不限于 STMicroelectronics、NXP、Infineon、Texas Instruments 等。
3. 仿真器和调试器:支持 Keil 自家的 ULINK 仿真器和其他第三方仿真器,如 SEGGER J-Link。
4. RTOS 和中间件:支持多种 RTOS,如 FreeRTOS、SafeRTOS 等,以及多种中间件,如 TCP/IP 协议栈、文件系统等。
- 用途:
1. 嵌入式系统开发:Keil MDK 主要用于开发基于 ARM Cortex-M 和 Cortex-R 系列微控制器的嵌入式系统。
2. 工业控制:适用于需要高性能和实时响应的工业控制系统。
3. 消费电子:用于开发家用电器、个人娱乐设备等消费电子产品。
4. 汽车电子:用于开发汽车信息娱乐系统、车身控制模块等汽车电子产品。
5. 物联网(IoT):用于开发连接到互联网的智能设备和传感器网络。
6. 安全和监控系统:用于开发安全监控摄像头、门禁系统等安全相关产品。
注意:编译工具链如果没有配置MDK Keil的话后面编译工具选择AC5和AC6会报错因为没有添加Keil。
2. ARMCC V5 (armcc)
- 特点:ARM Compiler V5 是一个成熟的商业编译器,提供了广泛的优化选项和代码生成技术,以确保代码在ARM架构上运行得更快、更高效。
- 支持:提供全面的技术支持和定期更新。
- 用途:适合需要高性能和稳定性的企业级开发.
3. ARMCC V6 (armclang)
- 特点:ARM Compiler V6 是基于LLVM/Clang前端的编译器,提供了现代的编译器特性,如C++14、C11等语言标准的支持,以及更先进的代码优化技术。
- 支持:同样提供全面的技术支持和定期更新。
- 用途:适合需要最新语言特性和高性能优化的现代嵌入式系统开发。
4. IAR ARM C/C++ Compiler (iccarm)
- 全称:IAR Embedded Workbench for ARM
- 特点:由IAR Systems提供的编译器,它是一个完整的开发工具链,包括编译器、调试器和各种开发工具。它以生成高效、可靠的代码而闻名。
- 用途:广泛应用于嵌入式系统开发,特别是在对性能和可靠性要求极高的场合。
title:对比
2. 开源编译器
1. GNU Arm Embedded Toolchain (arm-none-eabi-gcc)
- 特点:这是一个完全开源的编译器,基于GCC(GNU Compiler Collection),社区支持强大,可以自由地修改和分发。
- 支持:主要依靠社区支持,更新频繁,但可能不如商业版稳定。
- 用途:适合预算有限、需要开源解决方案的项目,或者对编译器源代码有特定需求的开发环境。
- RISC-V GCC Toolchain (riscv-none-embed-gcc)
- 特点:这是一个针对RISC-V架构的开源GCC工具链。支持RISC-V指令集架构的各种实现。提供了编译、链接和调试工具。
- 支持:支持RISC-V基金会定义的所有标准扩展。适用于RISC-V社区和开发者。
- 用途:用于开发基于RISC-V架构的嵌入式系统和应用。适合研究和教育用途。
- MIPS MTI GCC Compiler
- 特点:MIPS MTI GCC Compiler是一个针对MIPS架构的开源GCC编译器。提供了编译、链接和调试工具。支持MIPS32和MIPS64架构。
- 支持:支持多种MIPS架构变种。适用于需要MIPS解决方案的项目。
- 用途:用于开发基于MIPS架构的嵌入式系统和应用。适合需要MIPS处理器支持的项目。
- Universal GCC Toolchain (gcc)
- 特点:这是一个通用的GCC工具链,支持多种处理器架构。提供了编译、链接和调试工具。支持跨平台开发。
- 支持:支持广泛的处理器架构,包括ARM、MIPS、RISC-V等。适用于多种操作系统和平台。
- 用途:用于开发跨平台的应用程序。适合需要通用编译解决方案的项目。
title:对比
2)选择
- 考虑一:目标开发平台
此处为ST-ARM系列,初步筛选为所有ARM系列编译器
- 考虑二:优先商业付费
在此筛选考虑结果为MDK Keil,因为其自带的AC5、AC6工具链的编译速度比开源的要快不少
- 考虑三:工具其集成度(可选)
经过前两轮考虑已经选出合适的工具啦,不需要在考虑此步
3)安装
4)配置
选择构建器:点击AC6左侧的双箭头弹窗如上,此处我们选择AC6,因为CubeMX生成的项目是基于AC6的

配置构建器:点击图示红圈部分进入构建器设置界面(此设置界面功能部分等价于Keil的魔术棒设置)

图:构建器配置页面展示
勾选选项:MicroLB(内置了stdio等库的微小继承库)
5)测试
(2)烧录工具
引言:一般调试仿真工具都携带有下载程序的功能,但是下载程序工具却不一定有调试仿真的功能。因为你可以不调试不仿真但是一定得下载代码到目标单片机中。
1)种类
1. 硬件工具
2. 软件工具
- JLink for Cortex-M chips
特点:JLink是由Segger公司生产的调试器和烧录器,专门用于基于Cortex-M系列的ARM微控制器。
接口:JLink提供USB接口,支持JTAG和SWD接口协议,可以实现快速且稳定的程序烧录和调试。
用途:广泛用于Cortex-M系列微控制器的程序烧录和调试,特别是在需要高级调试功能时。
- STLink for STM32 chips
特点:STLink是STMicroelectronics公司提供的调试和烧录工具,专为STM32系列微控制器设计。
接口:STLink同样提供USB接口,支持JTAG和SWD及SWIM接口协议。
用途:用于STM32系列微控制器的程序烧录和调试,是STM32开发中常用的工具。
- pyOCD for Cortex-M chips
特点:pyOCD是一个开源的调试器和烧录器,使用Python编写,支持Cortex-M系列微控制器。
接口:pyOCD通过USB接口与微控制器通信,支持基于CMSIS-DAP协议的JATG、SWD调试器。
用途:适用于需要开源解决方案的Cortex-M系列微控制器的程序烧录和调试。
- OpenOCD for Cortex-M chips
特点:OpenOCD是一个开源的工具,用于调试和烧录多种架构的微控制器,包括Cortex-M系列。
接口:OpenOCD支持多种接口协议,包括JTAG、SWD和CMSIS-DAP。
用途:广泛用于各种微控制器的程序烧录和调试,特别是在需要开源和跨平台解决方案时。
- Shell download program by custom shell command
特点:这是一种通过自定义shell命令来下载程序到微控制器的方法。
接口:这种方法不依赖于特定的硬件接口,而是通过命令行界面实现程序的烧录。
用途:适用于需要自动化烧录流程或者在没有专用烧录硬件的情况下进行程序烧录。
2)选择
- 考虑一:拥有的硬件工具
本次仅仅拥有cmsis-dap调试工具,所以只能选择pyocd软件工具。
- 考虑二:自身开发平台(可选)
前面一步已经考虑出合适的工具啦,这步就不需要考虑了
1. CMSIS DAP+PyOCD
CMSIS DAP
PyOCD
- 简介: Pyocd是ARM 开发的一个 python 包(python package),大部分基于CMSIS DAP协议的的烧录器都可以通过PyOCD的软件层被调用烧录,此外该软件包可以使用其他多种USB调试器对 arm cortex-M 微控制器进行调试、编程(烧录程序)。
说白了就是个下载的驱动软件目前支持 Daplink、ST-Link、jlink。目前从 pyocd github 上看到的,pyocd 内部默认安装70多个常用的单片机支持包,但是通过使用 CMSIS-Packs 几乎支持所有基于 comtex-m 内核的单片机。(是要能用keil、Eclipse写的单片机都可以用)
优点:
- pyocd 提供了命令行工具,使用这工具可以用来调试、烧录、擦除 MCU
- pyocd 提供了python API,可是使用这些API来实现控制 MCU(读取MCU寄存器、暂停、运行、复位MCU等)
- pyocd 支持 windows、linux、Mac操作系统
- 通用性比起J-LINK,ST-LINK来讲要强大很多
缺点:
3)安装
1. 安装Python
引言:这一步是为了下一步打基础的,因为pyocd就是pip管理的一个包而已
- 相关链接
**注意**:千万不要下最新版本,一般3.9-3.10就行,太新了很容易发生报错
**提示**:如果你已经安装了Python可以跳过这一步,但是得检查你是否已经添加环境变量,参见下面操作步骤的第三步。
- 操作步骤:
- 1. 下载Python3.10

- 2. 安装Python 3.10(注意:一定得勾选添加Path到系统变量,要不然命令行使用不了pip报错找不到)
-
- 3. 检验Python 3.10是否安装上
- Win+R键输入CMD回车

- 输入Python -v回车

图:回车之后终端命令行应该显示的信息
- 问题集锦:
2. 安装PyOCD
相关链接
pyOCD官方文档链接
操作步骤
1、由于pyocd是基于python开发的,所以你需要支持python环境、并将pip加入path环境中,这个过程很简单,这里就不做太多赘述,可以参考这个->点击教程
2、最新稳定版本的 pyOCD 可以通过 pip 安装,命令如下:
pip install -U pyocd
3、安装成功后终端输出如下信息
Installing collected packages: wcwidth, sortedcontainers, pyelftools, intelhex, appdirs, zipp, typing-extensions, pyusb, pycparser, psutil, prettytable, natsort, lark, intervaltree, importlib-resources, hidapi, capstone, pylink-square, libusb-package, importlib-metadata, cffi, cmsis-pack-manager, pyocd
Successfully installed appdirs-1.4.4 capstone-4.0.2 cffi-1.17.1 cmsis-pack-manager-0.5.3 hidapi-0.14.0.post4 importlib-metadata-8.5.0 importlib-resources-6.4.5 intelhex-2.3.0 intervaltree-3.1.0 lark-1.2.2 libusb-package-1.0.26.2 natsort-8.4.0 prettytable-3.12.0 psutil-6.1.0 pycparser-2.22 pyelftools-0.31 pylink-square-1.3.0 pyocd-0.36.0 pyusb-1.2.1 sortedcontainers-2.4.0 typing-extensions-4.12.2 wcwidth-0.2.13 zipp-3.21.0
``
4. PyOCD命令
首先打开CMD、输入
pyocd --version

可以查看到安装的版本.
输入
pyocd --help
可以查看帮助信息、可以看到python提供了9条命令
**
commander跟cmd: 可交互的终端,
erase: 擦除命令
flash:烧录命令
reset:复位设备
gdbserver跟gdb:用于gdb调试的
json:以json格式输出信息
list:可以列出dap-link、目标IC、特定板子的信息
pack:用于管理CMSIS-Pack
server:运行debug服务
**
如果想知道上述命令的用法可以使用 pyocd + 上述中的一个命令 + -h/--help,如下:

这些命令各有什么用呢?什么情况下要用什么命令?这些命令怎么配合使用?
比如,使用 CMSIS-DAP 给 MCU 下载固件,一般会使用上位机 KIELL 通过 CMSIS-DAP 下载,首先 上位机 KEIL 能找到 CMSIS-DAP,然后需要选择所下载的 MCU,然后选择所要下载的固件,这 3 步都设置好后,就可以下载程序了,
根据这些,依次介绍 pyocd 的命令:
list or json:查看能够使用的调试器、支持的 MCU
pack:管理支持的 MCU
flash & erase : 对 MCU 进行编程、擦除
(1)pyocd list 命令
从 pyocd 帮助信息来看:
list List information about probes, targets, or boards.
可以知道 list 命令使用来查看 调试器、目标芯片、板子的信息,
pyocd list
pyocd list -p
列出连接到电脑上的 CMSIS-DAP 或者 ST link,当没接如任何pyocd所支持的设备时,如下:

接入了一个 CMSIS-DAP 跟 ST Link 后如下:

(1.1) pyocd list -t/--target
列出所支持的IC,可以是内置的,也可以是通过安装pack获得支持的,

上面图片展示了列出了 pyocd 内置的一部分 MCU。
我的电脑中已近安装了 STM32G4 的pack,上图中,STM32G4 系列后面就显示了 pack
(1.2) pyocd list -b/--board
列出所支持的板子,如下:

(2)pyocd json 命令
json Output information as JSON.
(2.1) pyocd json -t
从帮助信息来看,是输出所有已知的 target,先试下pyocd json -t命令,如下:

输出一大堆数据,除了有pyocd 版本信息外,就是一些MCU的信息,有MCU的厂商、型号,还有该信息是内置的还是来自pack。
试下能不能输出指定 MCU 的信息:

pyocd list 跟 pyocd json 功能应该是差不多的,都是输出一些信息,如接入了电脑的调试器信息,系统所支持的单片机等,只不过输出方式不同,pyocd list 是直接输出相关信息,pyocd json 是以 json 格式输出相关信息。
(3)pyocd pack 命令
pyocd 通过两种方法支持 MCU,一个是内置的(builtin),这个数量有限,还有一个是通过 pack 来支持,需要用pyocd 操作什么 MCU,安装对应的 pack , 类似 keil5 ,新安装的 Keil5 不支持任何单片机,如果要使用新安装的keil 支持某类型号单片机,需要安装对应的软件包。
pyocd 提供了一个内置的子命令来对pack进行管理,安装、查找、删除等,来看下 pyocd pack 命令的帮助信息:

送上图来看,有5个功能选项:
-c:清楚保存在电脑上的pack信息
-u:更新pack索引
-s:显示已安装的pack
-f:查找某个IC对应的pack
-i:安装指定的pack
pyocd 使用的 pack 有个默认的存放路劲,我电脑上为:
C:\Users\用户\AppData\Local\cmsis-pack-manager\cmsis-pack-manager
pyocd pack 命令就是对该目录的文件进行管理。
(3.1)pyocd pack -U
使用方法为:
pyocd pack -u
第一次使用该命令的时候,会在pyocd存放pack文件的默认路劲下下载不同厂商不同系列 MCU 的 pack 的描述文件(pdsc文件)和 index.json、aliases.json 文件。执行过一次之后,会从网络上更新相应的文件。下图是一个执行pyocd pack -u的结果,有出现错误。

下图是执行了pyocd pack -u 后,pack 所在文件夹多了很多文件:

(3.2)pyocd pack -f
使用方法为:
pyocd pack -f partnumber
该命令会显示出对应型号 MCU 的 pack 的信息,如下图,显示了 STM32G431 所对应 pack 的信息

(3.3)pyocd pack -i
使用方法为:
pyocd pack -i partnumber
该命令安装指定型号MCU的pack,如下图:

不过,由于网络的问题,一般很难下载完成,跟keil下载pack一样,非常慢,经常下载失败,可以手动下载所需的pack,然后放到对应目录,格式统一为这样、将前面的名字删掉。
pyocd pack -s
安装有pack后,执行结果为:
pyocd flash 命令
用CMSISDAP+STM32G4 如下:
STM32G4 的测试程序是用 Cube MX 创建工程、然后用vscode打开
第一次测试,首先执行 pyocd list查看是否成功识别到设备,确认能够找到 CMSIS-DAP 后。
输出的帮助信息看不出来 pyocd flash 应该怎么用:
非常多选项,这里只关注烧录的功能,通过查阅 pyocd 的文档,了解到可以使用如下命令来给MCU烧录程序:
pyocd flash -t mcu_partnumber firmware
我的 MCU 是 stm32G431RBTx,测试固件是 HAL_06_LCD.hex,尝试使用命令 :
pyocd flash -t stm32G431RBTx HAL_06_LCD.hex来烧录程序,结果如下:
接着我们可以使用vscode配置pyocd了
用EIDE打开,在烧入配置中选择pyOCD
在芯片选择上,选择已经安装过pack包的芯片
点击下载按钮,就可以完成程序的下载
4)配置
3. 配置PyOCD
- 操作步骤
- 打开VSCODE,点击在EIDE扩展面板中的Flasher Configuration右侧的双向箭头,在弹出的面板中选择PyOCD

图:烧录器选择界面演示
- 创建一个适合的项目,在编译后点击下载按键进行功能验证

图:成功验证示意图
PS:完结撒花!至此你可以快速的进行其他开发啦!第四步是额外内容,有助于你更好的理解PyOCD,不是必看内容。
- 错误集锦
5)测试
(3)仿真调试
引言:你问我为啥需要调试仿真?当你使用TTL方式下载程序时候你就会发现你无法知道程序在单片机上运行到每一步的变量状况和寄存器状态,这样情况下你就无法排查Bug了,只能借助仿真模式仿真单片机运行这个程序的情况,但是仿真毕竟和实际有区别不能完全等效。这个个角度上来讲,仿真叫做虚拟调试,调试叫做上机调试,接下来我们依次介绍仿真和调试及其工具的了解选择
1)仿真
2)调试
0. 简介
引言:要想介绍调试器,那么绝对离不开介绍编译,下面我们来介绍编译、调试、工具链三个前置知识(PS:我知道你们忘记的差不多了)
C编译
编译器+链接器会帮你们完成下面三个过程,一般使用GNU GCC,因为跨平台,资料多
- 预处理
- 编译
- 汇编
- 链接:生成可以烧录的.bin文件
C调试
GDB+GDBServer会帮你完成调试的准备工作
- 创建调试接口:GDB(调试器)我们使用arm-none-eabi-gdb
- 映射硬件调试器至接口:GDBServer,作为硬件调试器和GDB软件的连接桥梁,我们使用PyOCD
- 调试硬件:DAP-LINK(各家有各自的GDBServer)

C工具链
你肯定不想自己装编译器+链接器+GDB这么多东西,所以有人帮你装好了
Arm GNU Toolchain工具链,他包含了:
- 编译器:arm-none-eabi-gcc.exe
- 链接器:arm-none-eabi-ld.exe
- 调试器:arm-none-eabi-gdb.exe
注意:有人会想既然是工具链为什么不能选择MinGW而是Arm GNU ToolChain呢?因为后者是GNU对ARM特化出的工具链,目标调试文件是axf,elf这样的单片机程序文件,但是Windows上前者只能调试exe文件,所以不采用。
1. 种类
引言:上文我们介绍了ARM主要的编译工具链,那么接下来我们介绍基于这种工具链出现的工具调试工具
- CotexDubug:基于Arm GNU ToolChain,专门给嵌入式用的
2. 选择
基于 C++ GDB/LLDB进行Debugger的方案只能用于桌面C程序Debug根本不能用于单片机C程序Debug,所以我们只能选择Arm GNU Tool Chain工具链
3. 安装
引言:安装主要有两中方式,从EIDE插件自动下载安装和从网络下载手动安装两种方式,两者选其一即可,推荐前者。
4. 配置
- 点击右侧Debug按钮进入Debug分页
- 创建:点击创建
launch.json
选择workspace

图:创建launch.json后的默认界面
- 粘贴:把下面内容粘贴到该json文件的configuration键中
}
"name": "Cortex Debug",
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}\\build\\STM32F103VET6X\\STM32F103VET6X.axf", // 换成实际axf文件路径,注意output文件夹是虚拟的,打开你的资源管理器去确认实际的
"request": "launch",
"type": "cortex-debug",
"runToEntryPoint": "main",
"targetId": "stm32f103ve", // 换成你目标开发芯片ID,在你配置芯片包的那个细分的ID
"servertype": "pyocd", // 换成你使用的调试器服务
"serverpath": "E:\\计算机开发\\Scripts\\pyocd.exe", // 换成你实际pyocd的路径
"armToolchainPath": "E:\\GNU ARM Embedded Toolchain\\10 2021.10\\bin", // 换成你实际gdb的路径
"gdbPath": "E:\\GNU ARM Embedded Toolchain\\10 2021.10\\bin\\arm-none-eabi-gdb.exe", // 换成你实际gdb的路径,是Arm GUN Tool Chain的gdb,非MinGW的gdb
}
--- 分割线:上面的是第一版,下面的是我改进后的,优先选第二版,其配置通用性更强---
5. 测试
- 测试:点击Debug选项测试(注意得是左侧红色圈出部分的Debug按钮,非右侧Debug按钮)

图:Debug成功运行
由于pyocd使用python开发,可以使用 pyocd python api 做个上位机一键烧录,或实现云端服务器烧入
- 问题集锦
- 描述:VSCODE右下角弹窗报错空服务类型参数
Invalid servertype parameters. The following values are supported: "jlink", "openocd", "stlink", "stutil", "pyocd", "bmp", "pe", "qemu", "external"
- 分析:没有配置Debug依附工具路径
- 措施:配置好上文提到的
launch.json
文件
- 验证:

图:Debug成功运行
(4)完整测试
错误集锦
编译错误
- 报错:编译报错No space in execution regions with .ANY selector matching xxx

- 分析:内容空间不足,通过与开发板的例程项目对比发现MDK-ARM目录下的Startup文件对不上。例程项目是stm32f103vetx但是我创建的是stm32f103vx
- 解决:把EIDE的构件器从AC5更换至AC6,原因暂时不明,日后有时间再来研究,推测新版CubeMx生成的项目是基于AC6编译工具链的。
- 验证:

---
下载错误
报错1:下载报错0%0001258 C Memory transfer fault @ 0x08000000-0x08000fff [__main__]

分析1:EIDE项目没有配置芯片包导致yaml为空,pyocd无法正常读取目标芯片yaml配置信息导致报错
解决1:在芯片支持包列表选项中添加相应的芯片包(先加SM32F10X芯片包,在选择添加STM32F103VE目标MCU库)

检验1:下载信息报错改变0001164 C Target type stm32f103ve not recognized. Use 'pyocd list --targets' to see currently available target types. See <https://pyocd.io/docs/target_support.html> for how to install additional target support. [__main__]
分析2:在终端输入命令pyocd list
、pyocd list --targets
检查发现pyocd没有配置STM32F103VE的下载方式,需要自己去补充到pyocd中(此处要求你把python添加到系统环境变量中,否则会报错无法识别的函数等错误)

图:pyocd list命令输出——被错误识别的目标芯片

图:pyocd list --targets命令输出——没有包含目标芯片
解决2:终端环境下输入pyocd pack -i stm32f103ve
(此处要求你把python添加到系统环境变量中,否则会报错无法识别的函数等错误;此处可能得开梯子否则很慢)
图:输入该命令后终端显示的结果
验证2:终端环境输入pyocd pack show
、pyocd list
查看输出;点击下载选项查看能否下载

图:两次命令先后输出结果

图:再次点击下载后的命令行输出
至此,楼主在尝试下载时候发生的问题已经解决
- 下载错误
- 报错:
0001213 C No ACK received [__main__]
- 分析:这是由于CubeMX在配置项目时会默认关闭调试引脚,此时你如果仍要下载可以使BOOT0拉高电平(按住Reset)也可以成功下载,但是无法调试
- 解决:创建项目时候把Debug功能引脚打开

- 验证:

图:Debug功能运行正常
- 链接:
- 调试报错
title:检错总结
- **工作流交叉验证**:在编译报错时候我一开始查找信息发现网上都说是项目配置有问题,因为这个项目本身就是给Keil生成的,所以我拿keil编译一边发现能过。这个时候对于同一个工作流,一个是验证过的,一个是有问题的,那么自然我们会通过对比这两个工具系统在"编译"工作上区别来定位错误。最终我定位到Keil5现在换装的是AC6编译器而我EIDE默认配置为AC5,把配置调整到AC6后错误就解决了——用检验过的校验出现问题的标**杆验证思想**
-
四、总结
首先这个教程是基于别人教程的基础上根据自己的理解进行内容编排修改而来的,报了许多错误,但是好在最后成功了。按照往常惯例我最后做一个总结