Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
F407 如何使用ENV加载U盘 ?
发布于 2020-03-06 13:53:10 浏览:2706
订阅该版
* 本帖最后由 sync 于 2020-3-6 14:50 编辑 * 使用F407 参考[https://www.rt-thread.org/docume ... thread-driver-usbh/](https://www.rt-thread.org/document/site/application-note/driver/usb/an0046-rtthread-driver-usbh/)\bsp\stm32\libraries目录下也有drv_usbd.c这个文件,但是生成的工程总是不对 有人使用F407 可以配置好U盘吗? 编译提示 ..\libraries\HAL_Drivers\drv_usbd.c(21): error: #235: variable "_stm_udc" was declared with a never-completed type ``` #include
#ifdef BSP_USING_USBD #include
#include "board.h" #include
#include
static PCD_HandleTypeDef _stm_pcd; static struct udcd _stm_udc; static struct ep_id _ep_pool[] = { {0x0, USB_EP_ATTR_CONTROL, USB_DIR_INOUT, 64, ID_ASSIGNED }, {0x1, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x1, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x2, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x2, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x3, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, #if !defined(SOC_SERIES_STM32F1) {0x3, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, #endif {0xFF, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 0, ID_ASSIGNED }, }; ```查看文件发现 结构体udcd 是定义在usb_device.h ,drv_usbd.c文件里面使用的都是usb_device.c里面的函数, 全部引用关系搞好后,可以正常编译 下载后显示 ``` \ | / - RT - Thread Operating System / | \ 4.0.2 build Mar 6 2020 2006 - 2019 Copyright by rt-thread team lwIP-2.0.2 initialized! [D/USBD] No class register on usb device msh />list_device device type ref count -------- -------------------- ---------- usbd USB Slave Device 0 e0 Network Interface 0 uart1 Character Device 2 pin Miscellaneous Device 0 ```
查看更多
passion
2020-03-06
这家伙很懒,什么也没写!
>单步调试发现进入这个函数后,就变成死循环了 ,一直在while(1)里面出不来了 > ... --- 先不要管代码哪里卡死 先确定下外部的几个重要的相关问题 1.U盘是否已经挂载好了 list_device[attach]13945[/attach] 2.检查确认下常用的几个配置是否到位 需要打开 libc 功能 DFS功能开启,同时下面还有个 ELM协议也要激活了 ![](https://www.rt-thread.org/document/site/application-note/components/dfs/figures/1528354745063.png) U盘长文件名、扇区大小之类的后面再调整也可以
19
个回答
默认排序
按发布时间排序
Lengyue1983
2020-03-06
这家伙很懒,什么也没写!
时钟配置对吗,48M usb, 开启中断了吗
sync
2020-03-06
这家伙很懒,什么也没写!
:'(:'( 用错文件了, 应该用drv_usbh.c 我用成drv_usbd.c了 :'(:'(
sync
2020-03-06
这家伙很懒,什么也没写!
[i=s] 本帖最后由 sync 于 2020-3-6 17:53 编辑 [/i] 使用drv_usbh.c后,已经可以正常加载usb设备了 ``` \ | / - RT - Thread Operating System / | \ 4.0.2 build Mar 6 2020 2006 - 2019 Copyright by rt-thread team lwIP-2.0.2 initialized! msh /> msh /> msh />list_de list_device msh />list_device device type ref count -------- -------------------- ---------- usbh USB Host Bus 0 e0 Network Interface 0 uart1 Character Device 2 pin Miscellaneous Device 0 ``` 但是U盘还是没有加载成功 ![736,124](https://www.rt-thread.org/document/site/application-note/driver/usb/figures/usize.png) 为什么看不到这个信息呢?
passion
2020-03-06
这家伙很懒,什么也没写!
>使用drv_usbh.c后,已经可以正常加载usb设备了 > >但是U盘还是没有加载成功 --- 昨晚我刚刚调试通过 需要打开的设置比较多 下面两篇文章你都要参考检查核对下 [https://www.rt-thread.org/document/site/application-note/driver/usb/an0046-rtthread-driver-usbh/#stm32-usb-host-u](https://www.rt-thread.org/document/site/application-note/driver/usb/an0046-rtthread-driver-usbh/#stm32-usb-host-u) [https://www.rt-thread.org/document/site/application-note/components/dfs/an0012-dfs/](https://www.rt-thread.org/document/site/application-note/components/dfs/an0012-dfs/) 参考FAQ [https://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/#_36](https://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/#_36)
sync
2020-03-06
这家伙很懒,什么也没写!
感谢回复,从调试看USB Host Bus 已经加载上了, 打开调试 插入U盘显示信息如下 ``` \ | / - RT - Thread Operating System / | \ 4.0.2 build Mar 6 2020 2006 - 2019 Copyright by rt-thread team lwIP-2.0.2 initialized! msh />usb connected port 1 status 0x10201 reset port start enumnation ```
sync
2020-03-06
这家伙很懒,什么也没写!
单步调试发现进入这个函数后,就变成死循环了 ,一直在while(1)里面出不来了 ``` static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { int timeout = timeouts; while (1) { if (!connect_status) { return -1; } rt_completion_init(&urb_completion); HAL_HCD_HC_SubmitRequest(&stm32_hhcd_fs, pipe->pipe_index, (pipe->ep.bEndpointAddress & 0x80) >> 7, pipe->ep.bmAttributes, token, buffer, nbytes, 0); rt_completion_wait(&urb_completion, timeout); rt_thread_mdelay(1); if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == HC_NAK) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nak\n")); if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); } HAL_HCD_HC_Halt(&stm32_hhcd_fs, pipe->pipe_index); HAL_HCD_HC_Init(&stm32_hhcd_fs, pipe->pipe_index, pipe->ep.bEndpointAddress, pipe->inst->address, USB_OTG_SPEED_FULL, pipe->ep.bmAttributes, pipe->ep.wMaxPacketSize); continue; } else if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == HC_STALL) { RT_DEBUG_LOG(RT_DEBUG_USB, ("stall\n")); pipe->status = UPIPE_STATUS_STALL; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } return -1; } else if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == URB_ERROR) { RT_DEBUG_LOG(RT_DEBUG_USB, ("error\n")); pipe->status = UPIPE_STATUS_ERROR; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } return -1; } else if(URB_DONE == HAL_HCD_HC_GetURBState(&stm32_hhcd_fs, pipe->pipe_index)) { RT_DEBUG_LOG(RT_DEBUG_USB, ("ok\n")); pipe->status = UPIPE_STATUS_OK; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } size_t size = HAL_HCD_HC_GetXferCount(&stm32_hhcd_fs, pipe->pipe_index); if (pipe->ep.bEndpointAddress & 0x80) { return size; } else if (pipe->ep.bEndpointAddress & 0x00) { return size; } return nbytes; } continue; } } ```
passion
2020-03-06
这家伙很懒,什么也没写!
当你U盘能正确识别之后,可以实际测试下读写是否正常 如果不正常 先不要着急 因为很可能不是你的问题 我昨晚移植好USB HOST,然后能识别U盘,ls命令都正常了 下面发现没法创建文件 第二天早上换了U盘测试 运气好 直接正常,心想不应该啊,就又找了5个U盘,其中2个正常识别 正常读写 另外3个电脑正常使用,放在RT上就不行,调整了U盘为FAT32 扇区改小了 其中一个正常 剩下俩死活连不上 ps:我用的是r.t. V3 lst版本 USBHOST是从4.0版本上移植下来的(git中搜索关键词找到相应commit,看下改了哪些文件,照着在V3上修改) 配置中全部使用env工具,好处是比较快 不用到处去找到底应该开哪个宏定义
passion
2020-03-06
这家伙很懒,什么也没写!
[i=s] 本帖最后由 passion 于 2020-3-6 18:47 编辑 [/i] [attach]13946[/attach] .我的移植主要涉及红框中的这些文件,全部都要修改 你可以参考官方的git修改记录 另外需要注意的就是前面我说的两个链接中介绍的设置都需要开启 libc fat协议支持 扇区大小等等 下图就是官方git上的修改记录 [attach]13947[/attach]
sync
2020-03-06
这家伙很懒,什么也没写!
好的,感谢回复,明天确认后再反馈了,今天一开始就用错文件,耽误不少时间,希望明天可以顺利了
sync
2020-03-07
这家伙很懒,什么也没写!
今天从github重新下载代码,使用stm32f407-atk-explorer 例子,直接加载drv_usbh.c就可以了 测试了三个U盘一个可以识别,两个不能识别 测试发现U盘内含有MBR分区表的无法加载,使用diskgenius修改为FDD模式后,一个可以正常识别,另一个老的金士顿U盘仍不能识别 但使用开发板自带的U盘例程这三个都是可以识别的,估计这个驱动还有完善的地方,暂时满足使用。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.7k
关于作者
sync
这家伙很懒,什么也没写!
提问
12
回答
412
被采纳
78
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部