Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CDC
USB
在STM32F407 Disc1上使用RT-Thread CDC
发布于 2022-04-12 13:54:14 浏览:1625
订阅该版
[tocm] # 1 测试环境 | environment | version | note | | ---------------- | ----------------- | --------------------- | | STM32F407-Disc1 | Disc1 | | | RT-Thread Studio | v2.2.1 | | | RT-Thread kernel | latest(2020-3-30) | 稍落后于github master | # 2 新建工程 ## 2.1 新建设置 ![image-20220411210755608.png](https://oss-club.rt-thread.org/uploads/20220412/f557182dcb9aaf1ff287fa44b09d27f3.png.webp) > - 由于STM32F407-Disc1 UART1默认的PA9,PA10已经被其他外设占用,改成PB6,PB7 > - 使用板载ST-Link下载调试 > - 后面更新系统时钟会用到 ## 2.2 编译测试 编译没有问题 ![image-20220411211245059.png](https://oss-club.rt-thread.org/uploads/20220412/b8a39357fd80602576a83633ef968920.png.webp) 控制台 ![image-20220411211708276.png](https://oss-club.rt-thread.org/uploads/20220412/3189be22f994c0174eade67c4022989f.png) ## 1.3 本地git仓库追踪 ```shell LT@DESKTOP-Win10 MINGW64 /e/WorkSpaces/RT_Thread_Studio/STM32F407_CDC (master) $ git lg * a95a8f1 - (HEAD -> master) chore: creat the default project with RT-Studio (26 seconds ago)
``` # 3 CubeMX 配置 打开工程下的CubeMx Setting ## 3.1 配置外部高速时钟 ![image-20220411214209870.png](https://oss-club.rt-thread.org/uploads/20220412/f3cd03fc822fdeb7a5ed7f75321ef379.png.webp) ## 3.2 使能 UART1 ![image-20220411214809422.png](https://oss-club.rt-thread.org/uploads/20220412/79364e7bc5ca06df17a43e2d1c9ec0d5.png.webp) ## 3.3 使能USB Device ![image-20220411214840912.png](https://oss-club.rt-thread.org/uploads/20220412/ff33025a114bd96fb0b19bdd20332d67.png.webp) > 这里不需要使能默认的USB FS interrupt,drv_usbd.c里会实现 ## 3.4 配置CLK ![image-20220411215420084.png](https://oss-club.rt-thread.org/uploads/20220412/288d3d30f5c2f60131fb5a3d44d7c06a.png.webp) > 注意: intput frequency 要选择板子上实际的8MHz,一开始没注意使用了默认的25MHz, 枚举一直不成功 ## 3.5 Project Manager 直接Generate code就可以了 ![image-20220411220227896.png](https://oss-club.rt-thread.org/uploads/20220412/dbded35623759871f11f24434c898681.png.webp) > IDE 选择默认的EWARM就行,这个在工程里不使用,会被排除编译! # 4 工程的调整 因为新生成的cubemx文件夹源码会被自动加入工程编译,而且头文件位置不会自动加入,所以不调整工程配置的话,编译会出现很多问题。 ![image-20220411220501052.png](https://oss-club.rt-thread.org/uploads/20220412/366b44b9356574ef861992a303e3a8c5.png.webp) 方法一: 手动调整,比较麻烦,而且后面每次保存RT-Thread Setting,都会更新scons update,导致手动配置的被去掉,除非你自己在相应文件下添Sconscripts 方法二:关闭CubeMx, RT-studio 会自动帮你添加Sconscripts。这个方法也是刚刚发现的隐藏彩蛋! ![image-20220411221730937.png](https://oss-club.rt-thread.org/uploads/20220412/f5f9ece87510dc03310b87f6beacc88b.png.webp) 在关闭前,先暂存了生成的刚刚生成的cubemx文件,关闭CubeMX后会发现RT_Thread_Studio偷偷做了不少事情 ![image-20220411222010401.png](https://oss-club.rt-thread.org/uploads/20220412/5d09f4675667ec85c12511a4da551070.png.webp) - 更新工程 - 生成的main函数加__WEAK修饰,避免冲突 ![image-20220412074450152.png](https://oss-club.rt-thread.org/uploads/20220412/3896b702b410affcf8f9a7ca7004613a.png.webp) - 更新drv_clk.c 使用CubeMX生成的SystemClock_Config ![image-20220412074117518.png](https://oss-club.rt-thread.org/uploads/20220412/fb594aea15210e44da316b4c3331e088.png) - 重命名 drivers/stm32f4xx_hal_conf.h -> drivers/stm32f4xx_hal_conf_bak.h,使用CubeMX生成的 drivers/stm32f4xx_hal_conf.h ![image-20220412075704484.png](https://oss-club.rt-thread.org/uploads/20220412/57f85b853fdb4770638d2f4002dadd26.png.webp) - 贴心地自动增加了Sconsript配合工程管理,这样相应的path 和source就不需要我们手动配置了 ![image-20220412075121917.png](https://oss-club.rt-thread.org/uploads/20220412/8e22dd3ce6d2ecbd8d596caa9cc9d214.png.webp) > 这里说明一下, application/main.c 和 cubemx/Src/main.c虽然同名,但是路径不同,并不冲突。 > > 这样我们就不需要像之前一样拷贝CubeMX生成的SystemClock_Config到board.c或者其他文件里了 > > ![image-20220412074824802.png](https://oss-club.rt-thread.org/uploads/20220412/9d7072bbd1183709e81d494432369ee6.png.webp) 编译一下,一次性通过: ![image-20220412080843868.png](https://oss-club.rt-thread.org/uploads/20220412/26204ce261f4cdc6c289e0eca3f912da.png.webp) **总之一句话,RT_Thread_Studio这次配合最新的源码把人性化做到了极致,赞一个!** # 5 CDC 配置 首先看下board.h 中关于如何配置usb device的提示,下面按照这些步骤逐步对一下!![image-20220412081103905.png](https://oss-club.rt-thread.org/uploads/20220412/7fc8459b4a72a56c2f9c03a7afeaf58e.png.webp) ## 5.1 USB driver framework 就是RT-Thread自带的USB框架了,需要在RT-Thread Setting开启一下,并选择我们需要的CDC协议 ![image-20220412081532040.png](https://oss-club.rt-thread.org/uploads/20220412/0096504b5e7f985810e3e6ffca5ddd69.png.webp) 保存更新后,会发现component里已经新加了USB 内核 和 CDC协议类的编译 ![image-20220412082053537.png](https://oss-club.rt-thread.org/uploads/20220412/0935a49ad4313caae0f447b8a6338534.png.webp) ## 5.2 定义 usb device相关的宏 在默认的RT-Thread Setting没有配置的情况下,需要手动打开board.h关闭的宏 `BSP_USING_USBDEVICE` ![image-20220412082323688.png](https://oss-club.rt-thread.org/uploads/20220412/e25866054b8764cb0d9d38e808f43a13.png.webp) ## 5.3 PCD 初始化 HAL_PCD_MspInit 定义在CubeMX生成的stm32f4xx_hal_msp.c中 ![image-20220412092915047.png](https://oss-club.rt-thread.org/uploads/20220412/56edc3530de5bb8541eced6cc5a097e3.png.webp) ## 5.4 SystemClock_Config 工程的调整章节已经说明,RT_Thread_Studio已经帮我们做好了。 ## 5.5 HAL_PCD_MODULE_ENABLED 在配置了USB外设的情况下,CubeMX生成的 drivers/stm32f4xx_hal_conf.h里,宏HAL_PCD_MODULE_ENABLED默认已经打开。 ![image-20220412093727646.png](https://oss-club.rt-thread.org/uploads/20220412/21919e1b6003863db3afb8b0feba91f3.png.webp) ## 5.6 编译测试 编译没有问题,MicroUSB连接PC,在设备管理器里出现了新的COM ![image-20220412094331246.png](https://oss-club.rt-thread.org/uploads/20220412/da95e10e7f0d9270787c8ff9edb7dbe6.png.webp) > 就是枚举时间有些太久了,大概8s左右,不太能接受 再看下Console,usbdevice 和 vcom 线程任务正常运行 ![image-20220412095049767.png](https://oss-club.rt-thread.org/uploads/20220412/555f872cca404ae767342baaac7e004d.png) # 6 CDC ECHO测试 设备枚举正常,参考[串口使用实例->串口接收不定长数据](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart?id=%e4%b8%b2%e5%8f%a3%e6%8e%a5%e6%94%b6%e4%b8%8d%e5%ae%9a%e9%95%bf%e6%95%b0%e6%8d%ae)实现一个Echo测试一下效果。改动部分如下: ``` #define SAMPLE_UART_NAME "vcom" /* 数据解析线程 */ static void data_parsing(void) { char ch; char data[ONE_DATA_MAXLEN]; static char i = 0; while (1) { ch = uart_sample_get_char(); // rt_device_write(serial, 0, &ch, 1); if(ch == DATA_CMD_END) { data[i++] = '\r'; data[i++] = '\n'; rt_device_write(serial,0,data,i); i = 0; continue; } i = (i >= ONE_DATA_MAXLEN-2) ? ONE_DATA_MAXLEN-2 : i; data[i++] = ch; } } ``` 再次编译测试: 1 在 vcom 设备枚举成功后,输入 `uart_data_sample` 命令测试 ![image-20220412123941414.png](https://oss-club.rt-thread.org/uploads/20220412/e8c71934cb73eea7e0c5cd378d66abe8.png.webp) 2 echo测试 我使用的是UartAssist(其他串口工具都行),打开设备并设置自动发生附加位0x0D('\r'),也就是代码里的DATA_CMD_END ![image-20220412124215110.png](https://oss-club.rt-thread.org/uploads/20220412/a8bddd4ad53afd51e4e8f2eb30d36046.png) 发送字符,echo成功 ![image-20220412125037370.png](https://oss-club.rt-thread.org/uploads/20220412/7ab81a75d05bb672a7104996da369cc9.png) 完! **下面计划,写一下CDC类调用流程,顺便看是否能优化一下枚举时间!**
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
blta
这家伙很懒,什么也没写!
文章
12
回答
9
被采纳
2
关注TA
发私信
相关文章
1
请教USB Host
2
STM32F4调试USB 读卡器(Slave)提示格式化
3
急求 STM32F4 USB Device MSC+SD 的相关问题
4
USB 框架问题
5
USB键盘
6
LPC17xx 如何添加USB HOST设备
7
RT-Thread目前支持USB HOST了吗?
8
USB HOST的支持问题
9
RTT 2.0.1 USB存储设备问题,枚举到USBREQ_GET_MAX_LUN后复位
10
USB库已经很久没更新了
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
keil_MDK
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
at_device
ulog
本月问答贡献
出出啊
1516
个答案
342
次被采纳
小小李sunny
1440
个答案
289
次被采纳
张世争
793
个答案
171
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部