0%

workflow——STM32(1)

Main Takeaway

记录我搭建CubeMX+VSCode+Ozone的STM32开发工作流的过程。

workflow——STM32(1)跟随知乎大佬NeoAndrew的博客搭建,并且适应浙大HW电控组的要求

Tips:文章中的图片均是从NeoAndrew的文章中copy下来的,侵删

Intro

搭建CubeMX+VSCode+Ozone的STM32开发工作流,以VSCode为编辑器,Ozone为调试接口的开发环境

大致开发流程:

image-20230829163959561

背景知识

编译全过程
  • C语言内存模型
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外设工作原理
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原理
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
img
  • 添加新文件:

    在makefile文件中直接添加路径即可

    1
    2
    3
    #C sources
    C_SOURCES = \
    path
    1
    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的调试日志,最后一个选项选择一个文件或者新建一个日志文件。

变量动态查看(可视化)

  1. 变量动态查看(可视化),这就是Ozone的大杀器。在变量添加到查看(watch)之后,右键点击watch中的变量选择Graph,变量会被添加到可视化查看中。你可以选择“示波器”的显示时间步长以及颜色等信息,还可以更改采样率。 注意,如果添加到动态调试窗口中没有反应,请在data sampling中修改一下”Sample Freq“为100Hz或200Hz即可
  2. 在ata sampling中会实时显示变量值,并且统计平均值和最大最小值,而且还会将所有采样值保存到一个csv文件当中,如果需要进一步分析可以导出这个数据文件
  • 如果没有打开窗口,现在view->timeline中打开可视化窗口。动态变量查看的窗口也在view->data sampling。 启用动态变量查看的流程如下:
image-20230829214414075

在代码窗口中选中需要观察的变量添加到watch窗口在watch选择要动态查看的变量添加到Datasample窗口

References