Windows搭建STM32开发环境(进阶篇)

在Windows下通过VSCode的EIDECortex-Debug插件实现编译、烧录、调试STM32。不仅兼容MDK工程,且具有自己的独立的工作区,不影响原来的MDK工程。本质上该教程适用所有ARM架构与C51架构的芯片,甚至是一些RISC-V架构。也可以通过EIDE的官方教程[1]搭建开发环境。

1.准备

  • 确保JLink与STM32建立了正确的SWD连接
  • 确保MDK能够正确编译烧录STM32工程

如果无法确保以上两点请参考基础篇[2]的细节。

2.插件安装

2.1 安装EIDE

安装EIDE

2.2 安装Cortex-Debug

安装Cortex-debug

3.EIDE插件配置

3.1 设置编译器工具链

VSCode侧边栏切换到EIDE选项卡,点击Configure Toolchain,设置EIDE的编译器路径(该插件需要使用Keil内置的编译器)。假设Keil安装的位置是D:\Keil_v5,则选择的文件夹路径应该为D:\Keil_v5\ARM\ARMCC\bin,大小写不敏感

设置EIDE的编译工具链

3.2 axf文件转elf文件

打开Open plug-in Settings,向下找到EIDE.ARM.Option: Axf To Elf并勾选上。
axf文件转elf文件

4.EIDE使用入门

强烈建议先读一遍官方文档[1]再按照以下步骤操作以降低失败的概率。

4.1 导入MDK项目

选择Import Project,再选择MDK,再选中blink.uvprojx,再点击右下角的ok保存EIDE工作区到当前工程目录下
导入MDK项目

4.2 芯片支持包

根据提示选择目标为STM32F1C8T6的芯片支持包。像STM32等比较知名的芯片可以直接在网络上下载From Repo;如果是华大的芯片比如HC32系列,则需要从本地From Disk读取.pack后缀的芯片支持包。其余同理,本质上需要提供.FLM文件以及.svd文件才能够正常烧录调试
芯片支持包

4.3 构建配置

一般在导入MDK项目时,EIDE插件就会复制该工程的构建配置。除非在编译不通过的时候,则逐项检查构建配置的每一项是否与原来的MDK项目一致。

4.3.1 RAM/ROM Layout

以RAM/ROM Layout为例,EIDE会保持与原MDK工程一致
RAM/ROM Layout对比

4.3.2 构建器选项

构建器选项中有一个比较重要的设置就是编译优化等级,即Optimization Level,在项目开发阶段尽量设置为-O0,也就是不开启任何的优化以方便调试。
设置编译优化登记为-O0

如果在调试中碰到异常情况:比如断点明明设置好了,但是断点无法暂停在指定位置;或者断点在设置之后偏移了很远。通常是由于编译器默认开启了O3的优化导致的。

4.4 烧录配置

烧录配置选择芯片

4.5 编译

点击Build按钮,或者快捷键F7,EIDE会自动保存当前工程文件并开始编译,Terminal窗口会输出编译信息且包含了RAM/ROM的静态使用情况,在资源使用评估方面非常直观🎉。
EIDE编译

4.6 烧录

EIDE烧录

5.Cortex-Debug插件配置

Cortex-Debug插件必须正确配置armToolchainPath以及JLinkGDBServerPath才能启动调试。如果启动调试失败就去Debug Console控制台定位具体的报错原因。

5.1 下载安装ARM工具链

从ARM官网下载ARM工具链[3],下载后安装,并复制bin路径(目的是为了告诉Cortex-Debug插件在启动调试的时候找到arm-none-eabi-gdb.exe的位置)

ARM官网选择工具链的版本

安装成功时gdb的位置

以安装路径D:\arm为例, 则需要复制的路径应该为D:\arm\13.2 Rel1\bin,因为Windows文件系统的原因需要多加入一个斜杠,填入Cortex-Debug的配置时,应为D:\\arm\\13.2 Rel1\\bin

5.2 设置方法

  • 找到Cortex-Debug插件,右键点击Extension Settings
  • 找到Cortex-debug: Arm Toolchain Path点击Edit in setting.json
  • cortex-debug.armToolchainPath处粘贴以上准备好的ARM工具链路径
  • 检查cortex-debug.JLinkGDBServerPath路径是否正确(比如Administrator就可能需要换成自己的用户名,尽量保证不要有中文)
    以下提供一个示例配置
    1
    2
    "cortex-debug.armToolchainPath": "D:\\arm\\13.2 Rel1\\bin",
    "cortex-debug.JLinkGDBServerPath": "C:\\Users\\Administrator\\.eide\\tools\\jlink\\JLinkGDBServerCL.exe",
    设置Cortex-Debug插件

6.调试

6.1 启动调试

F5启动调试,该调试启动的时间较长,实测需要20秒的时间才能进入主程序,不过在调试过程并不慢。调试的功能与逻辑均与VSCode一致。关于调试的入门用法可以参考《Linux搭建C开发环境》的4.调试入门[4]
启动调试

6.2 查看寄存器

以本篇文章的blink工程为例,不断翻转PC13的GPIO高低电平以实现LED灯闪烁。根据STM32F103的数据手册,其对应的GPIOC组下的ODR寄存器功能,Bit 13的值应该不断在01之前切换
查看寄存器的值

6.3 Live Watch

MEMORY窗口中提供了Live Watch的功能,与Keil的Watch功能一致,能够在不暂停程序的情况下,动态监控变量的值。添加到Live Watch的变量必须为全局变量,否则其无法监控到。
启用该功能前需要在Launch.json中添加liveWatch键值对,以下提供一个参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceRoot}",
"type": "cortex-debug",
"request": "launch",
"name": "jlink",
"servertype": "jlink",
"interface": "swd",
"executable": "build\\blink\\blink.elf",
"runToEntryPoint": "main",
"device": "STM32F103C8",
"svdFile": ".pack/Keil/STM32F1xx_DFP.2.3.0/SVD/STM32F103xx.svd",
"liveWatch": {
"enabled": true,
"samplesPerSecond": 4
}
}
]
}

动态监控变量的值

6.4 内存表

MEMORY窗口中提供了MEMORY功能,即内存表,输入合法地址就能监控其内存的值,甚至可以查看其内存值对应的ASCII码,设置内存的大小端显示顺序,以及根据需要按照4-Byte或者8-Byte对齐显示。以下写了一个长度为100的数组array,每循环一次所有数组的值自加1,内存发生变化的地方均会高亮显示。
内存表

参考


Windows搭建STM32开发环境(进阶篇)
https://blog.gogo.uno/2024/02/13/vscode-stm32-develop-pro/
作者
Orionxer
发布于
2024年2月14日
更新于
2024年8月3日
许可协议