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

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

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

  1. 首先,我更新了一下 RT-Thread 的源代码(因为 RT-Thread 的代码更新很快,短时间内就有可能有很多的代码更新)。
  2. 然后我进入 rt-thread\bsp\stm32目录下,找到了正点原子 F429 阿波罗开发板对应的BSP stm32f429-atk-apollo
    记录——基于 RT-Thread 实现 USB 虚拟串口_第1张图片
  3. 然后我先看了一下这个 BSP 当前支持不支持 USB。我在目录下打开 Env 工具,输入 menuconfig 命令,查看了一下,发现在硬件配置的片上外设的配置菜单中没有配置 USB 的选项,看来这个 BSP 还不支持 USB 设备。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第2张图片
  4. 然后我想到,新的 STM32 BSP 所有的 BSP 都是用的同一份驱动,我去看一下有没有做好的 USB 驱动吧。然后我就打开了 rt-thread\bsp\stm32\libraries\HAL_Drivers 目录,如下所示,发现里面果然有 usb 的驱动文件,叫做 drv_usbd_fs.c。这就很好办了。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第3张图片
  5. 打开同一目录下的 Sconscript 脚本文件,查看一下这个驱动依赖什么配置,发现依赖于 BSP_USING_USBD_FS 这个配置。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第4张图片
  6. 既然有驱动,就一定有 BSP 已经支持了这个功能,我搜索了 stm32 目录下所有的 BSP ,看哪个 bsp 下有这个配置项。顺便看一下依赖关系。发现 F469 的 bsp 有这个配置项,看起来打开这个配置的同时,利用 select 命令也打开了 RT_USING_USB_DEVICE 这个配置。有了这段示例就好说了,只要在正点原子阿波罗的 bsp 下也添加这段配置就好了。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第5张图片
  7. 修改正点原子 F429 阿波罗 bsp 下 Kconfig 文件,添加这一段配置项。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第6张图片
    记录——基于 RT-Thread 实现 USB 虚拟串口_第7张图片
  8. 然后就可以利用 Env 工具配置工程了。在 目录下输入 menuconfig 配置 usb,开启刚添加的 usb 驱动的配置项。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第8张图片
  9. 然后,配置 usb 的设备框架。开启虚拟串口。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第9张图片
  10. 然后保存并重新生成工程。 发现编译报错。看起来是硬件没有配置。需要打开 stm32CubMX 配置 usb 的硬件引脚。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第10张图片
  11. 打开 stm32f429-atk-apollo\board\CubeMX_Config 目录下 stm32CubMX 的工程,配置 usb.
    记录——基于 RT-Thread 实现 USB 虚拟串口_第11张图片
    记录——基于 RT-Thread 实现 USB 虚拟串口_第12张图片
  12. 发现开启 usb 功能之后,时钟配置报警告,我们再重新配置一下时钟。配置好之后,重新生成了一下代码。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第13张图片
  13. 由于更新了时钟树,所以还要把stm32f429-atk-apollo\board\CubeMX_Config\Src目录下main.c中的时钟配置函数SystemClock_Config更新到stm32f429-atk-apollo\board目录下的 board.c 文件中。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第14张图片
  14. 然后重新打开工程,编译,还是报错,cannot open source input file "stm32f4xx_hal_exti.h": No such file or directory ,我注释掉这个头文件重新尝试编译。再次编译,发现就没有问题了。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第15张图片
    记录——基于 RT-Thread 实现 USB 虚拟串口_第16张图片
  15. 下载运行,然后输入 list_device 命令可以看到注册到系统中的两个 usb 相关的设备。
    记录——基于 RT-Thread 实现 USB 虚拟串口_第17张图片
  16. 然后我在 main函数里添加了一段测试代码,编译下载运行。
#include 
#include 

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 函数里发送过来的消息了
    在这里插入图片描述
    记录——基于 RT-Thread 实现 USB 虚拟串口_第18张图片
    这样就在正点原子 F429 阿波罗开发板上实现了 USB 虚拟串口了。

你可能感兴趣的:(记录)