RT-Thread:STM32F407虚拟U盘,无法识别拔出问题解决方案
文章目录
- 前言
- 一、问题现象
- 二、确定BUG类型,硬件BUG?软件BUG?
- 三、解决问题
- 四、如何让U盘和文件系统共存
- 总结
前言
这几天为了公司案子在玩弄文件系统和U盘,今天用探索者开发板的W25Q128虚拟成U盘的时候又发现BUG,个人认为这个BUG不是RTT软件本身,应该是属于芯片自身问题,后面会讲到我的依据,如有讲错,大佬嘴下留情别喷我。我项目功能要求Flash需要搭载文件系统,USB插上电脑后,电脑能将其当做U盘一样进行文件操作,然而无法识别U盘拔出是很致命的,因为拔出U盘后我需要将USB占用W25Q128给解除掉,切换到文件系统上,无法识别拔出那么我就不知道什么时候解除,什么时候挂载。莫得办法!!赶紧找BUG吧!!
一、问题现象
1、将W25Q128虚拟成U盘插到电脑,可以正常识别,但是拔出U盘时却没有任何拔出的提示
2、无论多少次拔出都是一样,没有任何提示信息
二、确定BUG类型,硬件BUG?软件BUG?
1、我在网上也找了相关问题资料,找了很久只发现一篇文章讲了相关问题,但是讲的解决方案我并没有采纳,因为他也没有找到BUG根源。
2、最后我决定使用正点原子官方例程USB读卡器例程测试测试一下,令人惊讶的是虽然表面看起来正常,其实也存在这个问题,不看代码是看不出问题所在的。
3、原子的usbd_user.c这个是编写用户代码的文件,里面写了很多回调函数,其中有一个拔出U盘回调响应函数打印出USB Device Disconnected.的信息,然而事实上却没有打印出来。
4、原子程序运行的时候拔出U盘打印未连接信息是在man函数中的一个字符串USB DisConnected ,他通过判断变量USB_STATUS_REG的USB的轮询状态来确定当然USB连接状态。
5、为什么原子哥偏要使用这个轮训状态来判断U盘是否拔出,不直接使用回调函数,这样不香吗?不简单吗?原子哥也不傻,肯定是遇到和我一样的问题并且没法解决,所以我大概率觉得是芯片自身的问题,并非软件BUG,我也不能完全肯定,也希望知道真相的大佬能和我讨论一下。
三、解决问题
1、方法有三种:
- 芯片换方案
- 用某种方式掩盖BUG
- 提桶跑路
很明显要选择第二种方法挣扎一下啦!!不会吧~不会吧!难道真的有人想要选择提桶跑路吧!本人并没有使用原子哥的方案,因为有点麻烦,而且用他的方案用到我的工程中会有耦合性。
2、在USB的中断服务函数中发现了几个中断类型,其中一个是挂起和复位中断,挂起中断是在拔出U盘和挂起的时候会被触发,复位中断是在U盘插入的时候会触发,利用这个规律我们就可以干他!!
挂起中断:
复位中断(部分截图):
3、自定义一个局部的静态连接状态变量usb_connect_status,复位的时候置位,挂起的时候清零。HAL_PCD_SuspendCallback(hpcd);函数是用来解除U盘这个设备的,解除之后我才能让W25Q128挂载文件系统,这个函数我又是怎么知道的,往后看。
4、在USB中断服务函数中有相关的断开连接后执行的代码,实际上由于BUG的存在这些代码写了个寂寞,没啥乱用。我们有样学样,直接用这个函数来解除,至于其余代码就没必要了,因为存在BUG都没有作用。
5、实际上HAL_PCD_DisconnectCallback(hpcd);是用来回调下面的函数的,下面的函数就是用来解除的,执行了这个函数后就可以挂载文件系统了。
四、如何让U盘和文件系统共存
1、list_device的时候我们能发现Block Device的值,通过这个值就可以判断有没有东西在用W25Q128了,被占用那就不能挂载文件系统或者不能将其切换成U盘。这个就很简单啦~~
总结
一天过去了,飘落的秀发就和时间一样,无法挽回!我又能怎样呢?我可以回去躺尸~~
RT-Thread:STM32F407虚拟U盘,无法识别拔出问题解决方案相关推荐
- 请问各位如何用Delphi控制U盘的安全拔出????已经有源代码,但是不知道如何控制指定的U盘...
请问各位如何用Delphi控制U盘的安全拔出????已经有源代码,但是不知道如何控制指定的U盘 Delphi / Windows SDK/API http://www.delphi2007.net/D ...
- 在.NET中探测U盘的插入/拔出
当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,当消息的wParam 值等于 DBT_DEVICEARRIVAL 时,表示Media设备被插入并且已经可用 ...
- WIN TO GO (WTG):windows装入U盘 WTG安装+拔出U盘强制关机蓝屏处理(win10)
下载企业版镜像 LSTC LTSB-https://hellowindows.cn/ magnet:?xt=urn:btih:366ADAA52FB3639B17D73718DD5F9E3EE9477 ...
- WINDOWS检测U盘插入,拔出
检测U盘的插入或拔出状态,然后根据状态做出相关操作. 检测U盘是否被插入是通过监听WM_DEVICECHANGE消息来实现的. 判断-U盘拔出和插入-获取它盘符 2010-05-04 10:59 加入 ...
- Windows下使用Qt检测U盘插入和拔出的示例Demo程序
本文转载自Qt检测U盘插入拔出Demo 要做这个,要先知道Qt的QAbstractNativeEventFilter类,虚函数nativeEventFilter.这个类的主要作用是捕获全局window ...
- VMware虚拟机装系统时识别不出系统镜像文件(system not found / vmtool)
1:先排除IOS镜像是否有问题 我一开始是在阿里云镜像下载的,出现找不到镜像,因为新版VMware已经不能使用从其他地方下载的镜像文件,之后在官网下的问题解决了(官网:获取Ubuntu服务器版 | U ...
- WPF中检测U盘插入、拔出 实例
类代码: /// <summary>/// 声明一个委托,用于代理一系列自定义方法/// </summary>public delegate void FlashDiskDel ...
- QT:检测U盘插入和拔出(windows)
1.先检测驱动器: 2.可以使用GetDriveType函数来获取驱动器的类型,以下是函数的链接: https://docs.microsoft.com/zh-cn/windows/win32/api ...
- stm32f407单片机rt thread 片外spi flash OTA升级配置示例
参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...
最新文章
- 五点讲述C++智能指针的点点滴滴
- 『转载』|收藏|一张看懂AI知识体系
- 机器学习 KNN算法_0_丐版_鸢尾花集分类(matlab实现)
- Mybatis-数据插入
- Excel有哪些需要熟练掌握而很多人不会的技能!
- strip(),replace()和re.sub()用法
- 程序员杂志为啥没有了_计算机基础知识,程序员必备知识,java必会!新建一个TXT,发生了什么?...
- 编写tcp服务器发送hex格式_Android网络编程-TCP/IP协议
- 达梦数据库操作记录_【干货分享】达梦7与ArcGIS10.4进行安装适配详细步聚说明...
- HW RIPv2认证
- ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)
- HFSS19 官方中文教程系列Workshops L01
- POI数据获取-Python
- python爬虫实例(一) b站篇
- id2021中文直装版 v16.0附安装教程及软件特点
- 一篇文章带你了解国企程序员(超详细)
- 2(1) maximum number in a unimodal array
- 英语语法高考英语单词拼写必背全表
- Android混合开发(一)——移动端与前端交互之JSBridge引入
- 迁移操作系统:如何把系统迁移到固态硬盘SSD?