3、开发环境搭建(下):Windows WSL2 + 串口 + OpenOCD + Hello World

上一节我们把 WSL2 和 NuttX 工具链搞定了。这一节,咱们来点真格的——让代码跑在板子上。

说实话,嵌入式开发最磨人的往往不是写代码,而是环境配置。我见过太多新手卡在“烧录失败”这一步,一卡就是半天。别急,跟着我的节奏来,咱们一步步把串口、烧录工具都配好,最后跑通第一个 Hello World。

3.1 串口驱动:让电脑和板子“说上话”

串口是嵌入式开发者的“眼睛”。没有它,你连板子在干啥都不知道。

Windows 端配置

WSL2 不能直接访问 Windows 的物理串口。但有个变通办法——用 USB 转串口模块,比如 CH340、CP2102 这些。

  1. 插上你的开发板,打开设备管理器
  2. 找到“端口 (COM 和 LPT)”下面的 USB Serial Port
  3. 记下 COM 端口号,比如 COM3
我的小习惯:我会在 Windows 上装一个 MobaXterm 或者 PuTTY,先用它们测试串口通不通。别一上来就折腾 WSL2 的串口转发,先确认硬件没问题再说。

WSL2 里访问串口

WSL2 默认不挂载 Windows 的串口设备。你需要用 usbipd-win 这个工具来“共享”串口。

# 在 Windows PowerShell (管理员) 中安装
winget install --interactive --exact dorssel.usbipd-win

# 查看 USB 设备
usbipd list

# 找到你的串口设备 BUSID,比如 1-3
# 然后绑定到 WSL2
usbipd bind --busid 1-3

# 在 WSL2 中查看是否识别
ls /dev/ttyUSB*

如果看到 /dev/ttyUSB0/dev/ttyACM0,恭喜你,串口通了。

我曾经踩过的坑:usbipd 绑定后,Windows 那边就看不到这个设备了。调试的时候别慌,用 usbipd unbind --busid 1-3 就能释放回来。

3.2 安装 OpenOCD:烧录的“桥梁”

OpenOCD 是嵌入式开发的瑞士军刀。它负责把编译好的二进制文件烧进芯片里。

在 WSL2 中编译安装

# 安装依赖
sudo apt install libtool automake pkg-config libusb-1.0-0-dev

# 下载源码
git clone https://github.com/openocd-org/openocd.git
cd openocd

# 配置,记得加上 --enable-sysfsgpio
./bootstrap
./configure --enable-sysfsgpio --enable-stlink

# 编译安装
make -j$(nproc)
sudo make install

安装完成后,验证一下:

openocd --version

如果看到版本号,说明装好了。

为什么选 ST-Link? 因为 STM32 系列开发板最常见。如果你用 J-Link 或者其他调试器,把 --enable-stlink 换成对应的选项就行。

3.3 配置 OpenOCD 脚本

OpenOCD 需要知道你的芯片型号和调试器类型。以 STM32F4 Discovery 板为例:

# 创建一个配置文件,比如 board.cfg
source [find interface/stlink.cfg]
source [find target/stm32f4x.cfg]

# 设置烧录速度
adapter speed 1000

启动 OpenOCD:

openocd -f board.cfg

看到 Info : Listening on port 3333 for gdb connections,说明 OpenOCD 在等你了。

我的经验:OpenOCD 启动后别关终端。新开一个 WSL2 窗口,用 telnet localhost 4444 连上去,可以手动执行 resethalt 这些命令,调试起来很方便。

3.4 编译并烧录 Hello World

终于到了最激动人心的环节。咱们用 NuttX 自带的 hello 示例程序。

配置工程

cd nuttx
./tools/configure.sh stm32f4discovery:nsh
make menuconfig

在 menuconfig 里,确保:

  • Application Configuration → Examples → Hello World Example 选中
  • System Type → STM32F4 Discovery 配置正确

编译

make -j$(nproc)

编译完成后,会在 nuttx/ 目录下生成 nuttx.bin 文件。

烧录

# 方法一:用 OpenOCD 直接烧
openocd -f board.cfg -c "program nuttx.bin 0x08000000 verify reset exit"

# 方法二:用 GDB 加载(我更喜欢这种方式)
arm-none-eabi-gdb nuttx
(gdb) target remote localhost:3333
(gdb) monitor reset halt
(gdb) load
(gdb) continue
注意地址:STM32F4 的 Flash 起始地址是 0x08000000。不同芯片不一样,烧之前查一下手册。

3.5 验证 Hello World

烧录成功后,用串口工具连上板子。波特率通常设为 115200。

在 WSL2 里:

sudo screen /dev/ttyUSB0 115200

按下板子的复位键,你应该能看到:

NuttShell (NSH) NuttX-12.4.0
nsh> hello
Hello, World!!

看到这行字,说明你的开发环境彻底搭好了。

如果没看到输出:别慌。先检查串口线有没有接反(TX 接 RX,RX 接 TX)。我当年第一次调串口,焊错了两根线,折腾了俩小时才发现。

3.6 常见问题与避坑

问题 原因 解决办法
OpenOCD 找不到调试器 USB 权限问题 把用户加入 plugdev 组,或者用 sudo 运行
烧录时提示“Flash write error” 芯片被锁或者供电不足 按住复位键再烧,或者检查电源
串口输出乱码 波特率不匹配 确认板子和终端都用 115200
WSL2 里看不到 /dev/ttyUSB0 usbipd 没绑定成功 重新执行 usbipd bind,或者重启 WSL2
我曾经犯过的错:有一次烧录一直失败,我以为是 OpenOCD 配置问题,折腾了一下午。最后发现是 USB 线质量太差,供电不稳。换了一根带屏蔽的线,问题立刻解决。所以,别小看硬件细节。

3.7 小结

这一节内容不少,但每一步都很关键。总结一下:

  • 串口是调试的“眼睛”,必须配好
  • OpenOCD 是烧录的“桥梁”,编译安装不难
  • Hello World 跑通了,说明整个链路都通了

下一节,咱们会深入 NuttX 的任务调度机制。你会看到,一个 RTOS 内核到底是怎么管理多个任务的。嗯,那才是真正有意思的地方。