Windows 上的 gcc 链呢?既然你都看到这篇文章了,说明你应该大概是需要和我一样的这一套工具链的,但我还是想扯一点理由,这些理由对于你来说可能不是很充分,但对我来说是致命的。
WSL 发布之后我就开始不喜欢甚至讨厌 mingw 了,我认为 mingw 是一种很扭曲的东西,仅仅是在没有 WSL 的时代下的 linux 环境替代品罢了首先这篇文章针对的是 Windows 平台,所以其他平台可以退了(
既然是基于 WSL 的工具链,那么你必须先安装 WSL 2,以管理员模式打开 Powershell 并执行下面的代码以启用 WSL 功能
$ Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform, Microsoft-Windows-Subsystem-Linux这时候肯定会有人说:我听说
WSL 1的USB是直通的,因此用WSL 1应该会更好
虽然确实 WSL 1 的 USB 是直通的,但是这不代表 WSL 2 没有办法使用 USB,而且相信我,我最开始也是这样认为的,然后折腾了很久最终还是选择了 WSL 2
对于一些
PTC Creo用户可以放心安装VirtualMachinePlatform,虽然它和Hyper-V有不少联系,但是不用担心,实测Creo 9一切正常。
执行完上面的步骤后,你需要重启你的电脑来完成新功能的安装,这时候你可以顺路去 BIOS 中启用虚拟化,至于如何启用,请自行 Google
重启完成后,你还需要再额外安装一个程序,用于连接 USB 设备
usbipd-win: 官方 Github
首先你需要选择一个你喜欢的发行版,这里我选择 Archlinux,理由很简单,需要操作的步骤少,开箱即用
Archlinux WSL: 官方中文文档
当然如果你执意想用 Ubuntu 我也拦不住你,但是后面别忘了 update-alternitive
首先你需要安装超多的包,因为我本人使用 paru 作为 AUR Helper 因此后面的指令均基于 paru,配置软件源和更新keyring的过程已忽略,请自行 Google
arm gcc: $ paru -S arm-none-eabi-gcc arm-none-eabi-newlib arm-none-eabi-gdbc_cpp_properties.json 的工具: paru -S nodejs-lts-hydrogen git && npm install -g yarnJLink: paru -S jlink-software-and-documentation usbipparu -S wget base-devel有一些包可能看起来很陌生,下面会进行解释
usbip: 用于连接主机 USB 设备nodejs: 用于执行 STM32Helper当然在这之前你可能需要先从STM32CubeMX生成一个项目,构建系统选择 Makefile,然后直接在 WSL 中切换到项目根目录,运行 code . 即可打开 VSCode
然后你需要在插件市场中下载安装以下几个插件:
C/C++: 用于自动补全WSL: 最好有,可以方便很多Cortex-Debug: 用于调试(打断点等)接下来在你的项目根目录创建 .vscode 文件夹(如果不存在),并在其他一个你喜欢的地方克隆 STM32Helper 这个仓库
切记,本项目是针对于
STM32CubeMX并选择Make作为构建系统生成的项目!其他环境无法使用本项目,请参考该项目手动配置!
$ git clone https://github.com/Lama3L9R/stm32helper.git切换到该目录,执行 $ yarn install 安装依赖库。等待安装完成后就可以生成 c_cpp_properties.json 了,这个小工具使用方法很简单,只需要执行 index.js 并附带两个参数,就可以将生成好的文件输出在 STDOUT
2023/5/21 更新: 现在已无需那么麻烦,只需要执行 $ yarn install 后执行下方的指令即可一键设置 c_cpp_properties.json、Cortex-Debug 配置文件和构建配置文件(也就是 Ctrl+Shift+B)
2023/5/21 更新第二次: 现在已无需那么麻烦,只需要执行 $ yarn install && npm install -g . 后在项目根目录下执行下方的指令即可一键设置 c_cpp_properties.json、Cortex-Debug 配置文件和构建配置文件(也就是 Ctrl+Shift+B),主要是添加了可以全局安装的功能,如果你不喜欢全局安装,可以手动调用 index.js 就是麻烦些
$ stm32helper vscode .一份正常的 c_cpp_properties.json 大概长这个样子
{ "configurations": [ { "name": "STM32Helper", "includePath": [ "Inc", "Drivers/STM32F1xx_HAL_Driver/Inc", "Drivers/STM32F1xx_HAL_Driver/Inc/Legacy", "Drivers/CMSIS/Device/ST/STM32F1xx/Include", "Drivers/CMSIS/Include", "Middlewares/ST/STM32_USB_Device_Library/Core/Inc", "Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", "/usr/lib/gcc/arm-none-eabi/13.1.0/include", "/usr/lib/gcc/arm-none-eabi/13.1.0/include-fixed" ], "browse": { "path": [ "Inc", "Drivers/STM32F1xx_HAL_Driver/Inc", "Drivers/STM32F1xx_HAL_Driver/Inc/Legacy", "Drivers/CMSIS/Device/ST/STM32F1xx/Include", "Drivers/CMSIS/Include", "Middlewares/ST/STM32_USB_Device_Library/Core/Inc", "Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", "/usr/lib/gcc/arm-none-eabi/13.1.0/include", "/usr/lib/gcc/arm-none-eabi/13.1.0/include-fixed" ], "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" }, "defines": [ "__ACCUM_EPSILON__=0x1P-15K", "__ACCUM_FBIT__=15", "__ACCUM_IBIT__=16", 省略400多行... "__WINT_TYPE__=unsigned int", "__WINT_WIDTH__=32", null, "USE_HAL_DRIVER", "STM32F103xB" ], "intelliSenseMode": "clang-x64", "compilerPath": "/usr/bin/arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb ", "cStandard": "c17" } ]}请注意,本项目刚刚写完不久,因此脚本可能并不能处理任意环境,推荐使用 Archlinux 来避免出现奇怪的错误,如果出现了,请务必开一个 issue 来帮助这个项目更上一层楼
至此,你的环境已经配置好了一半了
USB 转发其实关于这部分,在 usbipd-win 的文档中写的相当详细了,推荐去查看
首先回到 Windows 并以管理员身份打开一个 Powershell,接下来你需要获取 JLink 设备所在的 USB ID
$ usbipd wsl list输出大概长这个样子
BUSID VID:PID DEVICE STATE1-1 be57:020f Best Audio, USB 输入设备 Not attached1-2 0b05:19af AURA LED Controller, USB 输入设备 Not attached1-5 046d:c539 USB 输入设备 Not attached4-4 1a81:203b USB 输入设备 Not attached5-3 1366:0105 JLink CDC UART Port (COM3), J-Link driver Not attached你需要关注的是 JLink 设备的 BUSID,在我的实例中即为 5-3。然后你就可以通过下面的指令将 JLink 连接到 WSL
$ usbipd wsl attach -b <BUSID>如果你想断开与 WSL 的连接,你可以将上面指令中的 attach 换成 detach 即可断开连接
现在如果你回到 WSL 中且安装了 usbutils 你就可以查询到 JLink 已经被识别到了
$ lsusbBus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 001 Device 002: ID 1366:0105 SEGGER J-Link <<< 成功的识别到了Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub这时候,如果你执行 JLinkExe 会发现他根本连不上这个设备,造成这个问题的主要原因是因为权限不够,只需要用 root 用户或者给予相应权限即可解决问题
若想正常使用 Cortex-Debug 还需要一些额外的配置
在 VSCode 中按下 Command Palette 的快捷键(默认为 Ctrl + Shift + P)后输入下面的指令
> Open user settings (JSON)即可打开用户设置,并在里面添加两个值,一个为:cortex-debug.JLinkGDBServerPath,另一个是:cortex-debug.gdbPath
cortex-debug.JLinkGDBServerPath: 您需要填写 JLinkGDBServer 的可执行文件完整路径,可以通过 $ which JLinkGDBServer 查询位置cortex-debug.gdbPath: 您需要填写 arm-none-eabi-gdb 的可执行文件完整路径,可以通过 $ which arm-none-eabi-gdb 查询位置保存这个文件,至此你的开发环境已经设置完毕,一切功能都基本可以正常使用