社区导航

 

搜索
查看: 262|回复: 2

[经验] 记录——基于RTT在STM32上实现 USB 虚拟串口

[复制链接]

47

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-6-21 17:43 | 显示全部楼层 |阅读模式

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

首先,我更新了一下 RT-Thread 的源代码(因为 RT-Thread 的代码更新很快,短时间内就有可能有很多的代码更新)。
然后我进入 rt-thread\bsp\stm32目录下,找到了正点原子 F429 阿波罗开发板对应的BSP stm32f429-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函数里添加了一段测试代码,编译下载运行。

  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3.  
  4. int main(void)
  5. {
  6.     rt_device_t dev = RT_NULL;
  7.     char buf[] = "hello rt-thread!\r\n";
  8.  
  9.     dev = rt_device_find("vcom");
  10.     
  11.     if (dev)
  12.         rt_device_open(dev, RT_DEVICE_FLAG_RDWR);
  13.     else
  14.         return -RT_ERROR;
  15.     
  16.     while (1)
  17.     {
  18.         rt_device_write(dev, 0, buf, rt_strlen(buf));
  19.         rt_thread_mdelay(500);
  20.     }
  21.  
  22.     return RT_EOK;
  23. }
  24.  

复制代码


连接开发板上的 USB_SLAVE 接口到电脑上,打开设备管理器,发现多了一个 USB 串行设备,用串口工具打开,就接收到 main 函数里发送过来的消息了


这样就在正点原子 F429 阿波罗开发板上实现了 USB 虚拟串口了。



回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 5 天前 | 显示全部楼层

没有图,不太理解~



回复

使用道具 举报

47

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 4 天前 | 显示全部楼层
MamoYU 发表于 2019-7-11 13:43 没有图,不太理解~

谢谢提醒 没注意到图坏了



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-16 05:54 , Processed in 0.123660 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表