记录——基于 RT-Thread 实现 USB 虚拟串口
记录一下我在正点原子 F429 阿波罗开发板上实现 USB 虚拟串口的过程,希望可以帮助到其他想要学习 USB 的人。
- 首先,我更新了一下 RT-Thread 的源代码(因为 RT-Thread 的代码更新很快,短时间内就有可能有很多的代码更新)。
- 然后我进入
rt-thread\bsp\stm32
目录下,找到了正点原子 F429 阿波罗开发板对应的BSPstm32f429-atk-apollo
。
- 然后我先看了一下这个 BSP 当前支持不支持 USB。我在目录下打开 Env 工具,输入
menuconfig
命令,查看了一下,发现在硬件配置的片上外设的配置菜单中没有配置 USB 的选项,看来这个 BSP 还不支持 USB 设备。
- 然后我想到,新的 STM32 BSP 所有的 BSP 都是用的同一份驱动,我去看一下有没有做好的 USB 驱动吧。然后我就打开了
rt-thread\bsp\stm32\libraries\HAL_Drivers
目录,如下所示,发现里面果然有 usb 的驱动文件,叫做drv_usbd_fs.c
。这就很好办了。
- 打开同一目录下的 Sconscript 脚本文件,查看一下这个驱动依赖什么配置,发现依赖于
BSP_USING_USBD_FS
这个配置。
- 既然有驱动,就一定有 BSP 已经支持了这个功能,我搜索了 stm32 目录下所有的 BSP ,看哪个 bsp 下有这个配置项。顺便看一下依赖关系。发现 F469 的 bsp 有这个配置项,看起来打开这个配置的同时,利用 select 命令也打开了
RT_USING_USB_DEVICE
这个配置。有了这段示例就好说了,只要在正点原子阿波罗的 bsp 下也添加这段配置就好了。
- 修改正点原子 F429 阿波罗 bsp 下 Kconfig 文件,添加这一段配置项。
- 然后就可以利用 Env 工具配置工程了。在 目录下输入 menuconfig 配置 usb,开启刚添加的 usb 驱动的配置项。
- 然后,配置 usb 的设备框架。开启虚拟串口。
- 然后保存并重新生成工程。 发现编译报错。看起来是硬件没有配置。需要打开 stm32CubMX 配置 usb 的硬件引脚。
- 打开
stm32f429-atk-apollo\board\CubeMX_Config
目录下 stm32CubMX 的工程,配置 usb.
- 发现开启 usb 功能之后,时钟配置报警告,我们再重新配置一下时钟。配置好之后,重新生成了一下代码。
- 由于更新了时钟树,所以还要把
stm32f429-atk-apollo\board\CubeMX_Config\Src
目录下main.c中的时钟配置函数SystemClock_Config
更新到stm32f429-atk-apollo\board
目录下的 board.c 文件中。
- 然后重新打开工程,编译,还是报错,
cannot open source input file "stm32f4xx_hal_exti.h": No such file or directory
,我注释掉这个头文件重新尝试编译。再次编译,发现就没有问题了。
- 下载运行,然后输入
list_device
命令可以看到注册到系统中的两个 usb 相关的设备。
- 然后我在 main函数里添加了一段测试代码,编译下载运行。
#include <rtthread.h>
#include <rtdevice.h>
int main(void)
{
rt_device_t dev = RT_NULL;
char buf[] = "hello rt-thread!\r\n";
dev = rt_device_find("vcom");
if (dev)
rt_device_open(dev, RT_DEVICE_FLAG_RDWR);
else
return -RT_ERROR;
while (1)
{
rt_device_write(dev, 0, buf, rt_strlen(buf));
rt_thread_mdelay(500);
}
return RT_EOK;
}
- 连接开发板上的 USB_SLAVE 接口到电脑上,打开设备管理器,发现多了一个 USB 串行设备,用串口工具打开,就接收到 main 函数里发送过来的消息了
这样就在正点原子 F429 阿波罗开发板上实现了 USB 虚拟串口了。