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

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

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

  1. 首先,我更新了一下 RT-Thread 的源代码(因为 RT-Thread 的代码更新很快,短时间内就有可能有很多的代码更新)。
  2. 然后我进入 rt-thread\bsp\stm32目录下,找到了正点原子 F429 阿波罗开发板对应的BSP stm32f429-atk-apollo
    bsp 路径
  3. 然后我先看了一下这个 BSP 当前支持不支持 USB。我在目录下打开 Env 工具,输入 menuconfig 命令,查看了一下,发现在硬件配置的片上外设的配置菜单中没有配置 USB 的选项,看来这个 BSP 还不支持 USB 设备。
    在这里插入图片描述
  4. 然后我想到,新的 STM32 BSP 所有的 BSP 都是用的同一份驱动,我去看一下有没有做好的 USB 驱动吧。然后我就打开了 rt-thread\bsp\stm32\libraries\HAL_Drivers 目录,如下所示,发现里面果然有 usb 的驱动文件,叫做 drv_usbd_fs.c。这就很好办了。
    usb 驱动
  5. 打开同一目录下的 Sconscript 脚本文件,查看一下这个驱动依赖什么配置,发现依赖于 BSP_USING_USBD_FS 这个配置。
    Sconscript 脚本
  6. 既然有驱动,就一定有 BSP 已经支持了这个功能,我搜索了 stm32 目录下所有的 BSP ,看哪个 bsp 下有这个配置项。顺便看一下依赖关系。发现 F469 的 bsp 有这个配置项,看起来打开这个配置的同时,利用 select 命令也打开了 RT_USING_USB_DEVICE 这个配置。有了这段示例就好说了,只要在正点原子阿波罗的 bsp 下也添加这段配置就好了。
    在这里插入图片描述
  7. 修改正点原子 F429 阿波罗 bsp 下 Kconfig 文件,添加这一段配置项。
    在这里插入图片描述
    在这里插入图片描述
  8. 然后就可以利用 Env 工具配置工程了。在 目录下输入 menuconfig 配置 usb,开启刚添加的 usb 驱动的配置项。
    在这里插入图片描述
  9. 然后,配置 usb 的设备框架。开启虚拟串口。
    在这里插入图片描述
  10. 然后保存并重新生成工程。 发现编译报错。看起来是硬件没有配置。需要打开 stm32CubMX 配置 usb 的硬件引脚。
    在这里插入图片描述
  11. 打开 stm32f429-atk-apollo\board\CubeMX_Config 目录下 stm32CubMX 的工程,配置 usb.
    在这里插入图片描述
    在这里插入图片描述
  12. 发现开启 usb 功能之后,时钟配置报警告,我们再重新配置一下时钟。配置好之后,重新生成了一下代码。
    在这里插入图片描述
  13. 由于更新了时钟树,所以还要把stm32f429-atk-apollo\board\CubeMX_Config\Src目录下main.c中的时钟配置函数SystemClock_Config更新到stm32f429-atk-apollo\board目录下的 board.c 文件中。
    在这里插入图片描述
  14. 然后重新打开工程,编译,还是报错,cannot open source input file "stm32f4xx_hal_exti.h": No such file or directory ,我注释掉这个头文件重新尝试编译。再次编译,发现就没有问题了。
    在这里插入图片描述
    在这里插入图片描述
  15. 下载运行,然后输入 list_device 命令可以看到注册到系统中的两个 usb 相关的设备。
    在这里插入图片描述
  16. 然后我在 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 虚拟串口了。
### RT-Thread 操作系统与 EC20 模块集成 #### 图形化配置系统的便利性 RT-Thread Studio 提供了一站式的开发环境,具有简单易用的图形化配置系统以及丰富的软件包和组件资源,这使得物联网开发变得更加简单和高效[^1]。 #### 移植EC20驱动至NUC972的具体需求分析 对于将移远通信的EC20驱动移植到NUC972上的情况,由于选择了mini PCIe接口版本并主要依赖于USB接口实现数据传输功能,因此重点在于确保能够正确识别并挂载该模块作为网络设备及多个虚拟串口设备。具体来说: - **USB接口的应用**:通过USB接口连接可以充分利用其较高的带宽优势来弥补传统UART接口速度不足的问题,并且允许更简便地完成即插即用的操作体验。 - **多端口映射机制**:当EC20被成功加载后,它会被Linux内核识别为一个标准网卡加上四个额外的TTY USB设备。前者负责承载IP层以上的所有协议栈交互;后者则可用于执行诸如初始化设置、状态查询等命令操作[^2]。 #### 实现过程概述 为了使上述设想成为现实,开发者需依次开展如下几个方面的工作: - 完成针对目标板子(如NUC972)特定硬件特性的适配工作——主要是指编写或调整必要的底层驱动程序; - 修改编译选项以激活对应外设的支持特性集,比如开启CONFIG_USB_SERIAL等相关参数开关; - 利用pppd或其他类似的PPP客户端工具发起PDP上下文建立请求从而获取合法公网地址接入互联网服务。 ```bash # 假定已安装好ppp及相关依赖库文件 sudo pppd call ec20-connect ``` 此段脚本展示了如何利用`pppd`来进行拨号联网尝试,其中`ec20-connect`应当是指向包含有APN名称在内的配置文件路径名。 #### 关联的技术考量 值得注意的是,在某些应用场景下可能还会涉及到对RTOS本身实时调度能力的要求。此时可以选择应用像Xenomai或是RT Preempt这样的增强型解决方案来改善整体系统的响应性和稳定性表现[^4]。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值