环境搭建
作者在使用官方IDE开发了一段时间后,发现了很多的不足之处,遂转战VSCode + 开源 arm 工具链 + OpenOCD开发STM32的环境,该方案可跨平台使用,希望对读者有所帮助。
需安装的软件如下:
1、STM32CubeMX:通过官方该工具可快速生成带makefile的HAL库工程。下载网址如下,需要登陆方可下载。
STM32CubeMX - STMicroelectronics
2、vs code:编辑器,链接如下
Visual Studio Code - Code Editing. Redefined
3、GNU Arm Embedded Toolchain:arm用的GNU工具链,包括编译器(gcc),调试器(gdb),链接器(ld)和其它工具。需配置环境变量。
GNU Toolchain | GNU Arm Embedded Toolchain Downloads – Arm Developer
4、 OpenOCD ( windows版 ):一个开源的片上调试器。仅需下载解压,配置环境变量。
5、Zadig:用来装jlink 的USB驱动的,虽然Jlink插上就能装驱动,但是直接装的OpenOCD识别不到。
Zadig - USB driver installation made easy
将jlink接入电脑,打开软件,选择Options---List All Devices,下拉菜单中选择J-link,然后在右侧选择WinUSB,点击Reinstall Driver。
6、Git:用于版本管理,需要注意的是我没有用mingw,因为国内网络环境有安装失败几率,其实GIT是基于mingw的,但是由于其轻量级的原因不支持make,需要添加make,wget等工具。
安装完成GIT后,需要进行以下四步操作:
- ezwinports - Browse Files at SourceForge.net下载make-x.x-x-without-guile-w32-bin.zip文件。
- 解压文件。
- 将解压出来的文件全部拷贝到: D:\Program Files\Git\mingw64\ ,如果跳出来需要替换的文件要选择不替换。
- 在git bash窗口下执行make,不提示command not found即为安装成功。
编译
利用STM32CubeMX生成makefile类型的工程。
安装vs code基本插件
Chinese (Simplified)、C/C++、C/C++ Snippets、ARM、Cortex-Debug。
配置c_cpp_properties.json。
点击黄色的小灯泡,
{ "configurations": [ { "name": "Win32", "includePath": [ "D:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.07/lib/gcc/arm-none-eabi/10.3.1/include", "${workspaceFolder}/Core/Inc", "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc", "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy", "${workspaceFolder}/Drivers/CMSIS/Include", "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F1xx/Include" ], "defines": [ "USE_HAL_DRIVER", "STM32F103xB" ], "compilerPath": "D:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.07/bin/arm-none-eabi-gcc.exe", "intelliSenseMode": "gcc-x64", "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "", "path": [ "${workspaceFolder}" ] } } ], "version": 4 }
配置tasks.json。
在.vscode目录下创建tasks.json文件。
{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "make", "args": [ "-j4" ] }, { "label": "clean", "type": "shell", "command": "make", "args": [ "clean" ] } ] }
调试
openocd配置
在项目文件夹下新建openocd.cfg文件。openocd启动时,会自动在当前目录下寻找名为openocd.cfg的文件作为配置文件。
下载svd文件
VS Code可以通过它来知道外设寄存器的地址分布,从而把寄存器内容展示到窗口中。下载好的STM32F103.svd文件放在项目文件夹根目录即可。
https://github.com/posborne/cmsis-svd
配置VS Code的调试功能
openocd在.vscode文件夹中新建一个launch.json.
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Cortex Debug", "cwd": "${workspaceRoot}", "executable": "${workspaceRoot}/build/${workspaceFolderBasename}.elf", "request": "launch", "type": "cortex-debug", "device":"STM32F103C8", //使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php "svdFile": "./STM32F103xx.svd", //svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd "servertype": "openocd", //使用的GDB Server "configFiles": [ "${workspaceRoot}/openocd.cfg" ], "preLaunchTask": "build" } ] }
Jlink GDB Server配置
安装SEGGER Jlink驱动全家桶。
SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace
在前面用Zadig修改了jlink驱动的,建议先在设备管理器里面卸载,然后安装全家桶。安装完成后记着添加环境变量。
给代码中添加源文件和头文件
在C:\Program Files (x86)\SEGGER\JLink\Samples\RTT
路径中,有一个Jlink RTT例程源码压缩包解压。然后把压缩包里的整个RTT文件夹复制到你的STM32工程中:
添加log.h文件。
#ifndef _LOG_H_ #define _LOH_H_ #include "SEGGER_RTT.h" #define LOG_DEBUG 1 #if LOG_DEBUG #define LOG_PROTO(type,color,format,...) \ SEGGER_RTT_printf(0," %s%s"format"\r\n%s", \ color, \ type, \ ##__VA_ARGS__, \ RTT_CTRL_RESET) /* 清屏*/ #define LOG_CLEAR() SEGGER_RTT_WriteString(0, " "RTT_CTRL_CLEAR) /* 无颜色日志输出 */ #define LOG(format,...) LOG_PROTO("","",format,##__VA_ARGS__) /* 有颜色格式日志输出 */ #define LOGI(format,...) LOG_PROTO("I: ", RTT_CTRL_TEXT_BRIGHT_GREEN , format, ##__VA_ARGS__) #define LOGW(format,...) LOG_PROTO("W: ", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__) #define LOGE(format,...) LOG_PROTO("E: ", RTT_CTRL_TEXT_BRIGHT_RED , format, ##__VA_ARGS__) #else #define LOG_CLEAR() #define LOG #define LOGI #define LOGW #define LOGE #endif #endif // !_LOG_H_
修改main.c、修改Makefile
和json
配置文件
修改main.c
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "log.h" /* USER CODE END Includes */
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ cnt++; LOGE("this is an error !"); LOGI("this is an iofo with params ! CNT:%d",cnt); LOGW("this is an warning !"); HAL_Delay(500); }
修改Makefile
修改c_cpp_properties.json
修改launch.json
修改Tasks.json
按F5进入调试模式,然后运行。终端中出现了带颜色的log日志,同时各个寄存器的值都可以看到,读者可自行探索其他功能。