# Embedded Toolchain Doc
**Repository Path**: orlenHJ/embedded-toolchain-doc
## Basic Information
- **Project Name**: Embedded Toolchain Doc
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2024-10-27
- **Last Updated**: 2025-02-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# VSC+MingGW+GNU+CubeMX 搭建现代化Embedded Toolchain开发环境
> 前言:
## 环境配置安装
### 1.Git
[Git for Windows](https://gitforwindows.org/)
安装成功的验证:在Windows PowerShell 里输入`git --version`
出现如上图显示,则为安装成功。
### 2.Visual Studio Code
[Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)
### 3.MingGW
压缩包在GitHub下载:[Releases · niXman/mingw-builds-binaries](https://github.com/niXman/mingw-builds-binaries/releases)
找寻Assets里的**x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0.7z**(或者其它最新版也可以)压缩包下载。
这里建议使用压缩包配置,在解压后手动配置环境变量之后用起来也是一样的,并且可以节省大量在线下载的时间。如果使用在线安装的下载地址:[MinGW - Minimalist GNU for Windows download | SourceForge.net](https://sourceforge.net/projects/mingw/)
下载后的压缩包,放置在自己知道或集中管理的文件夹里,例如我放在D盘的mingw64文件夹里:
配置环境变量path的时候的路径就是:`D:\mingw64\bin`
将这个路径复制下来就可以开始配置环境变量:
安装成功的验证:在Windows PowerShell 里输入`mingw32-make --version`
即为配置成功。
这个时候我们可以找到刚才复制配置环境的路径里面,将`mingw32-make.exe`文件复制一份并命名为`make.exe`,然后再使用`make`指令。
### 4.GNU
下载地址:[Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer](https://developer.arm.com/downloads/-/gnu-rm)
推荐使用压缩包配置:
将压缩包解压后,自行放置在自己知道或集中管理的文件夹里,例如我创建了`D:\Arm-GNU-Toolchian`该文件夹,放置压缩包解压出来的内容。
配置环境变量path的时候的路径就是:`D:\Arm-GNU-Toolchian\bin` 、 `D:\Arm-GNU-Toolchian\arm-none-eabi\bin` 。
步骤同上。
安装成功的验证:
如果没有报错,并输出了一堆路径和参数说明安装成功。
### 5. OpenOCD
下载地址 : [Download OpenOCD for Windows](https://gnutoolchains.com/arm-eabi/openocd/) (最新的openocd 0.11.3可能只支持 cmsis-dap v2)
将压缩包解压后,自行放置在自己知道或集中管理的文件夹里,例如我创建了`D:\OpenOCD`该文件夹,放置压缩包解压出来的内容。
添加环境变量:`D:\OpenOCD\bin`
## 工程与编译使用
在VScode里推荐的安装插件如下
- **C/C++**:提供C/C++的调试和代码高亮支持
- **Better C++ Syntax**:提供更丰富的代码高亮和智能提示
- **C/C++ Snippets**:提供代码块(关键字)补全
- **Cortex-Debug**,**Cortex-Debug: Device Support Pack - STM32F4**:提供调试支持。cortex debug还会自动帮助你安装一些调试相关的插件,包括RTOS支持和内存查看等。
- **IntelliCode**,**Makfile Tools**:提供代码高亮支持。
- **通义灵码/GitHub Copilot** : AI辅助代码编写
VSCode常用快捷键包括:
| 功能 | 快捷键 |
| ---------------------- | ------------- |
| 选中当前行 | Ctrl+L |
| 删除当前行 | Ctrl+Shift+K |
| 重命名变量 | F2 |
| 跳转到定义 | Ctrl+点击 |
| 在打开的文件页中切换 | Ctrl+Tab |
| 在当前文件查找 | Ctrl+F |
| 在整个项目文件夹中查找 | Ctrl+Shift+F |
| 查找所有引用 | Alt+Shift+F12 |
| 返回上一动作 | Alt+左 |
更多快捷键可以按ctrl+K再按ctrl+S显示,并且可以修改成你最习惯的方式。此外,使用Snippets可以大幅度提高重复性的代码编写速度,它可以直接帮你补全一个代码块(如for、while、switch);补全和snippet都使用`Tab`键接受代码提示的提议,通过↑和↓键切换提示。
为了提供完整的代码高亮支持,需要配置Makefile tools插件的make程序路径,打开设置,搜索**make path**找到设置并填写:
在STM32CubeMX里生成项目时,Toolchain/IDE选择Makefile:
用VSCode打开创建的项目文件夹,Makefile Tools插件会询问你是否帮助配置intellisense,选择是。
Makefile就是我们要使用的构建规则文件。
对于一个已经拥有makefile的项目,在VScode里打开一个终端,输入:`mingw32-make -j12` (-j参数表示参与编译的线程数,一般使用-j12)
**可以使用示例工程:[f407_gnu/test](https://gitee.com/orlenHJ/f407_gnu)**
注意,多线程编译的时候输出的报错信息有时候可能会被打乱(多个线程同时往一个终端写入程序运行的信息),要是看不清报错,请使用`mingw32-make`,不要进行多线程编译。
make命令根据makefile的内容,调用arm-none-eabi-gcc编译器,传入了一堆的参数以及编译选项然后运行。
指令,就可以实现编译,在build目录下生产出hex和bin文件,还有用于调试的.elf文件。有了hex和bin文件,然后使用JLink进行烧录就可以了。
**!!如果添加新的源文件与头文件:**
Makefile的大部分内容在CubeMX初始化的时候就会帮你生成。如果新增了.c的源文件,你需要在`C_SOURCES`中新增:
例如:在末尾添加:`User/BSP/Src/exti_bsp.c `换行需要在行尾加反斜杠\ 。
如果新增了头文件,在`C_INCLUDES`中新增头文件所在的文件夹:
例如:在末尾添加:`-IUser/BSP/Inc `换行需要在行尾加反斜杠\ 。
其它内容参考链接:[Makefile Tutorial By Example](https://makefiletutorial.com/)
可能觉得每次编译都要在命令行里输入参数,太麻烦了,可以使用插件的Makefile Tools ,一键编译:
或者可以编写一个`task.json` , 需要在Terminal标签页中选择Configure Tasks... 创建一个新的.json文件。这是VSCode的一个任务配置,内容大致如下:
```json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build task", // 任务标签
"type": "shell", // 任务类型,因为要调用mingw32-make,是在终端(CMD)里运行的,所以是shell任务
"command": "mingw32-make -j24",// 要执行的任务命令
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
```
这样,你就可以点击VSCode工具栏上方的Terminal->Run task选择你刚刚配置的任务开始编译了。**更方便的方法是使用快捷键:`ctrl+shift+B`。** 之后要配置下载任务和调试任务等,也可以利用这种方法,新建一个xxx_task,实现一键下载、一键调试等。
## 调试
### Cortex-Debug调试
安装**Cortex-Debug**插件后,需要配置调试工具链路径:
VSCode进入设置,通过搜索找到cortex-debug插件的设置。
在settings.json 中编辑:
设置你的arm-gcc-toolchain的bin文件路径。
设置你的openocd路径(需要包含到openocd的可执行文件)。
使用找到你JLINK驱动的路径,设置JlinkGDBServerlCL.exe的路径(在Jlink安装目录下,CL代表command line命令行版本)。
gdbPath可以选择配置。
设置后如下图:
请看仓库**[f407_gnu/test](https://gitee.com/orlenHJ/f407_gnu)**里的`.vscode`下的`launch.json`。注意把路径替换掉或注释掉。`launch.json`已经添加了详细的注释。
(参考自HNU NeoZng的basic_framework配置文档)这里贴出:
```json
{
// 启动调试的快捷键是F5
"version": "0.2.0",
"configurations": [
// 使用dap-link(如无线调试器时的参考配置)
{
"name": "DAPlink",
"cwd": "${workspaceRoot}",
"executable": "${workspaceRoot}\\build\\f407_gnu.elf", // 要下载到调试器的文件,花括号中的是vscode两个预定义的参数
"request": "launch",
"type": "cortex-debug",
//使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择SVD文件)
//支持的设备见 https://www.segger.com/downloads/supported-devices.php
"device": "STM32F407VG",
//svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd
//该项目的根目录已经提供了C型开发板使用的外设svd文件
"svdFile": "STM32F407.svd",
"servertype": "openocd", //使用的GDB Server
"configFiles": [
"openocd_dap.cfg", // 配置文件已经在根目录提供,若要修改以此类推,openocd的路径下的share/scripts中有各种写好的配置文件
],
"runToEntryPoint": "main", // 调试时在main函数入口停下
"rtos": "FreeRTOS",
"preLaunchTask": "build task",//先运行Build任务编译项目,取消注释即可使用
"liveWatch": {
"enabled": true,
"samplesPerSecond": 4
}
// dap若要使用log,请使用Jlink调试任务启动,之后再打开log任务
// 若想要在调试前编译并且打开log,可只使用log的prelaunch task并为log任务添加depends on依赖
},
// 使用j-link进行调试时的参考配置
{
"name": "Jlink",
"cwd": "${workspaceFolder}",
"executable": "${workspaceRoot}\\build\\f407_gnu.elf",
"request": "launch",
"type": "cortex-debug",
"device": "STM32F407VG",
"runToEntryPoint": "main",
"showDevDebugOutput": "none",
"servertype": "jlink",
"interface": "swd",
"svdFile": "STM32F407.svd",
"rtos": "FreeRTOS",
"preLaunchTask": "build task",//先运行Build任务,取消注释即可使用
"liveWatch": {
"enabled": true,
"samplesPerSecond": 4
}
//"preLaunchTask": "log", // 调试时同时开启RTT viewer窗口,若daplink使用jlinkGDBserver启动,需要先开始调试再打开log
// 若想要在调试前编译并且打开log,可只使用log的prelaunch task并为log任务添加depends on依赖
},
{
"name": "DAP-attach",
"cwd": "${workspaceRoot}",
"executable": "${workspaceRoot}\\build\\f407_gnu.elf", // 要下载到调试器的文件,花括号中的是vscode两个预定义的参数
"request": "attach",
"type": "cortex-debug",
"device": "STM32F407VG",
"svdFile": "STM32F407.svd",
"servertype": "openocd",
"configFiles": [
"openocd_dap.cfg",
],
},
{
"name": "Jlink-attach",
"cwd": "${workspaceFolder}",
"executable": "${workspaceRoot}\\build\\f407_gnu.elf",
"request": "attach",
"type": "cortex-debug",
"device": "STM32F407VG",
"showDevDebugOutput": "none",
"servertype": "jlink",
"interface": "swd",
"svdFile": "STM32F407.svd",
"rtos": "FreeRTOS",
},
],
}
```
.svd 可以在 [tinygo-org/stm32-svd](https://github.com/tinygo-org/stm32-svd) 里找到不同的对应型号。这里仓库里[f407_gnu/test](https://gitee.com/orlenHJ/f407_gnu)建议使用**Jlink v9** (不要使用OB版本)。
然后选择**run and debug**标签页,在选项中选择你配置好的选项,开始调试。
开始调试后,显示的界面如下:
Cortex-Debug插件也已经支持live watch(变量动态监视),最高可设置的刷新频率为4Hz。
如图:
其它调试流程,如断点、变量修改、监视...在此不赘述,仅做配置的讲解。
### Ozone调试
## 展望
## 参考文献
[basic_framework: Hey this is the basic frame work for robomaster standard infantry Robots! enjoy using it, have fun developing Robot with us](https://gitee.com/hnuyuelurm/basic_framework)
[VsCode+OpenOCD 开发stm32系列_vscode openocd-CSDN博客](https://blog.csdn.net/pyt1234567890/article/details/122522700)
[VScode+MingGW+GNU+STM32CUBEMX搭建单片机开发环境_vscode mingw keil-CSDN博客](https://blog.csdn.net/qq_42839452/article/details/136757721?spm=1001.2014.3001.5506)