转载 - 基于 RT-Thread 实现 USB 虚拟串口

发布于 2020-07-02 10:08:52

记录——基于 RT-Thread 实现 USB 虚拟串口

记录一下我在正点原子 F429 阿波罗开发板上实现 USB 虚拟串口的过程,希望可以帮助到其他想要学习 USB 的人。

转载于:https://blog.csdn.net/newbie_Blogger/article/details/92617242

  1. 首先,我更新了一下 RT-Thread 的源代码(因为 RT-Thread 的代码更新很快,短时间内就有可能有很多的代码更新)。
  2. 然后我进入 rt-thread\bsp\stm32目录下,找到了正点原子 F429 阿波罗开发板对应的BSP stm32f429-atk-apollo

bsp 路径

  1. 然后我先看了一下这个 BSP 当前支持不支持 USB。我在目录下打开 Env 工具,输入 menuconfig 命令,查看了一下,发现在硬件配置的片上外设的配置菜单中没有配置 USB 的选项,看来这个 BSP 还不支持 USB 设备。

在这里插入图片描述

  1. 然后我想到,新的 STM32 BSP 所有的 BSP 都是用的同一份驱动,我去看一下有没有做好的 USB 驱动吧。然后我就打开了 rt-thread\bsp\stm32\libraries\HAL_Drivers 目录,如下所示,发现里面果然有 usb 的驱动文件,叫做 drv_usbd_fs.c。这就很好办了。

usb 驱动

  1. 打开同一目录下的 Sconscript 脚本文件,查看一下这个驱动依赖什么配置,发现依赖于 BSP_USING_USBD_FS 这个配置。

Sconscript 脚本

  1. 既然有驱动,就一定有 BSP 已经支持了这个功能,我搜索了 stm32 目录下所有的 BSP ,看哪个 bsp 下有这个配置项。顺便看一下依赖关系。发现 F469 的 bsp 有这个配置项,看起来打开这个配置的同时,利用 select 命令也打开了 RT_USING_USB_DEVICE 这个配置。有了这段示例就好说了,只要在正点原子阿波罗的 bsp 下也添加这段配置就好了。

在这里插入图片描述

  1. 修改正点原子 F429 阿波罗 bsp 下 Kconfig 文件,添加这一段配置项。

在这里插入图片描述
在这里插入图片描述

  1. 然后就可以利用 Env 工具配置工程了。在 目录下输入 menuconfig 配置 usb,开启刚添加的 usb 驱动的配置项。

在这里插入图片描述

  1. 然后,配置 usb 的设备框架。开启虚拟串口。

在这里插入图片描述

  1. 然后保存并重新生成工程。 发现编译报错。看起来是硬件没有配置。需要打开 stm32CubMX 配置 usb 的硬件引脚。

在这里插入图片描述

  1. 打开 stm32f429-atk-apollo\board\CubeMX_Config 目录下 stm32CubMX 的工程,配置 usb.

在这里插入图片描述
在这里插入图片描述

  1. 发现开启 usb 功能之后,时钟配置报警告,我们再重新配置一下时钟。配置好之后,重新生成了一下代码。

在这里插入图片描述

  1. 由于更新了时钟树,所以还要把stm32f429-atk-apollo\board\CubeMX_Config\Src目录下main.c中的时钟配置函数SystemClock_Config更新到stm32f429-atk-apollo\board目录下的 board.c 文件中。

在这里插入图片描述

  1. 然后重新打开工程,编译,还是报错,cannot open source input file "stm32f4xx_hal_exti.h": No such file or directory ,我注释掉这个头文件重新尝试编译。再次编译,发现就没有问题了。

在这里插入图片描述
在这里插入图片描述

  1. 下载运行,然后输入 list_device 命令可以看到注册到系统中的两个 usb 相关的设备。

在这里插入图片描述

  1. 然后我在 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;
}
  1. 连接开发板上的 USB_SLAVE 接口到电脑上,打开设备管理器,发现多了一个 USB 串行设备,用串口工具打开,就接收到 main 函数里发送过来的消息了

在这里插入图片描述
在这里插入图片描述
这样就在正点原子 F429 阿波罗开发板上实现了 USB 虚拟串口了。

4 条评论

发布
问题

分享
好友