Main Takeaway
记录我搭建CubeMX+VSCode+Ozone的STM32开发工作流的过程。
workflow——STM32(1)跟随知乎大佬NeoAndrew的博客搭建,并且适应浙大HW电控组的要求
Tips:文章中的图片均是从NeoAndrew的文章中copy下来的,侵删
Intro
搭建CubeMX+VSCode+Ozone的STM32开发工作流,以VSCode为编辑器,Ozone为调试接口的开发环境
大致开发流程:
背景知识
前置的知识:可见我的电学预演 | Immortal-Fates这篇文章
编译全过程:

- C语言内存模型

在一个代码块{ }内定义的变量会被放在栈区,一般来说,直接通过变量访问栈内存,速度最快(对于单片机)。而堆则是存储程序员自行分配的变量的地方,即使用malloc(),realloc() ,new等方法获取的空间。
- C language标准和编译器
开源的Arm GNU Toolchain,跨平台开发,开源,交叉编译
工具链包含了编译器,链接器以及调试器等开发常用组件。我们使用的Arm GNU toolchain中,编译器是arm-none-eabi-gcc.exe,链接器是arm-none-eabi-ld.exe,调试器则是arm-none-eabi-gdb.exe。通过跨平台调试器和j-link/st-link/dap-link,我们就可以在自己的电脑上对异构平台(即单片机)的运行进行调试了。
- Debug外设工作原理

DBG支持模块(红框标注部分,也可以看作一个外设)通过一条专用的AHB-AP总线和调试接口相连(Jtag或swd),并且有与数据和外设总线直接相连的桥接器。可以直接获取内存或片上外设内的数据而不需要占用CPU的资源,并将这些数据通过专用外设总线发送给调试器,进而在上位机中读取。
FPB(flash patch breakpoint)提供代码段点插入支持
DWT(data watch trace)追踪变量值的变化,还提供了一个额外的计时器可以用来计时
ITM(instrument trace macrocell)提供非阻塞式的日志发送支持==串口调试,还可以追踪CPU执行的所有指令
以上三个模块都需要通过TPIU(trace port interface unit)和外部调试器(j-link等)进行连接,TPIU会将三个模块发来的数据进行封装并通过DWT记录时间,发送给上位机。
- GDB调试MCU原理

不论使用MDK(KEIL)还是VSCode还是Ozone,实际上背后的流程相同。首先GDB会建立TCP/IP端口并提供接口,调试服务器(Server)作为硬件调试器和GDB软件的桥梁,将硬件调试器的相关功能(也就是DBG外设支持的那些功能)映射到GDB的接口上(通过连接到GDB建立的端口)。之后启动调试,将可执行文件下载到目标MCU上,然后从main开始执行。
环境配置
VSCode
- 安装各种插件(强烈建议看原文章)
其中C/C++,Makefile Tools(如果用makefile),CMake,CMake Tools必备,如果想要在VSCode中进行调试则Cortex-Debug也是必备的
- 安装MinGW,并添加到环境变量中
- 安装gcc-arm-none-eabi,并添加到环境变量中
- OpenOCD是用于调试的,如果想要在VSCode中使用则也需要安装
Tips:在vscode中进行简单的调试配置可以直接在References中查看文章,我没有配置就不做记录了
使用
makefile
Tips:浙大HW用的是CMake,所以我也会介绍CMake
- CubeMX生成代码的时候工具链选择makefile

添加新文件:
在makefile文件中直接添加路径即可
1
2
3#C sources
C_SOURCES = \
path1
2
3#C includes
C_INCLUDES = \
path
CMake
下载CMake并添加到环境变量中
CubeMX生成代码的时候工具链选择STM32CubeIDE
在VS Code中编辑
- 其中
.cproject .mxproject .project均可删去; .ld为链接脚本文件,在链接时使用,本目录下的.ld规定了设备内存相关信息;Core/Drivers/为 CubeMX 按照模板生成的文件,除Core/Src/main.c外一般不做改动。
- 其中
配置 CMake 工程:
添加
CMakeLists.txt模板至工程根目录,修改模板中的TODO内容,主要包括:- 工程名;
- FPU 的使用开关;
- DSP 库路径设置和版本选择;
- 编译优化等级,相关说明可参考官方文档;
- 头文件路径和源文件;
- 未列出的其他配置。
Tips:若更改
CMakeLists.txt中的option,运行配置并不会更新选项,需要删除build目录重新配置,或使用-D编译选项进行配置。如开启ENABLE_HARD_FP选项:
Bash 1 2cd build cmake .. -DENABLE_HARD_FP=ON
等我之后把这个流程跑通一遍再填坑
Ozone
安装Ozone,选择install a new instance
我选择得是3.26,因为对内的学长建议我安装这个
安装jlink,不要勾选update dll in other application,否则jlink会把ozone里面老的驱动和启动项替代掉。选择install a new instance
使用Ozone是开始也是先配置New Project Wizard==keil中的魔术棒
为了能够查看外设寄存器的值还需要在Peripherals中选择svd文件
选择构建之后生成的.elf文件(在项目文件夹下的build中)。这是调试器专用的文件格式,对其内容感兴趣可以自行搜索细节。此外ozone还支持.bin .hex .axf(最后一个是amr-cc,也就是keil的工具链会生成的)等格式。
最后一页不用动:如果希望保存jlink的调试日志,最后一个选项选择一个文件或者新建一个日志文件。
变量动态查看(可视化)
- 变量动态查看(可视化),这就是Ozone的大杀器。在变量添加到查看(watch)之后,右键点击watch中的变量选择Graph,变量会被添加到可视化查看中。你可以选择“示波器”的显示时间步长以及颜色等信息,还可以更改采样率。 注意,如果添加到动态调试窗口中没有反应,请在data sampling中修改一下”Sample Freq“为100Hz或200Hz即可。
- 在ata sampling中会实时显示变量值,并且统计平均值和最大最小值,而且还会将所有采样值保存到一个csv文件当中,如果需要进一步分析可以导出这个数据文件
- 如果没有打开窗口,现在view->timeline中打开可视化窗口。动态变量查看的窗口也在view->data sampling。 启用动态变量查看的流程如下:

在代码窗口中选中需要观察的变量添加到watch窗口在watch选择要动态查看的变量添加到Datasample窗口
References
CubeMX+VSCode+Ozone的STM32开发工作流(二)VSCode环境配置 - 知乎 (zhihu.com)
CubeMX+VSCode+Ozone的STM32开发工作流(三)利用Ozone进行可视化调试和代码分析 - 知乎 (zhihu.com)
CubeMX+VSCode+Ozone的STM32开发工作流(四)VSCode动态变量监视和可视化插件开发 - 知乎 (zhihu.com)
CubeMX+VSCode+Ozone的STM32开发工作流(五)无线J-Link和DAP-Link开发 - 知乎 (zhihu.com)
CubeMX + VS Code + Ozone 配置 STM32 开发环境 - Hello World 技术知识库 (zju-helloworld.github.io)当然还有我们浙大HW电控组的Wiki
开源调试软件OpenOCD调试stm32 - 知乎 (zhihu.com)开源调试软件OpenOCD