# 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)