文章目录

  • 前言
  • 一、问题现象
  • 二、确定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盘,无法识别拔出问题解决方案相关推荐

  1. 请问各位如何用Delphi控制U盘的安全拔出????已经有源代码,但是不知道如何控制指定的U盘...

    请问各位如何用Delphi控制U盘的安全拔出????已经有源代码,但是不知道如何控制指定的U盘 Delphi / Windows SDK/API http://www.delphi2007.net/D ...

  2. 在.NET中探测U盘的插入/拔出

    当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,当消息的wParam 值等于 DBT_DEVICEARRIVAL 时,表示Media设备被插入并且已经可用 ...

  3. WIN TO GO (WTG):windows装入U盘 WTG安装+拔出U盘强制关机蓝屏处理(win10)

    下载企业版镜像 LSTC LTSB-https://hellowindows.cn/ magnet:?xt=urn:btih:366ADAA52FB3639B17D73718DD5F9E3EE9477 ...

  4. WINDOWS检测U盘插入,拔出

    检测U盘的插入或拔出状态,然后根据状态做出相关操作. 检测U盘是否被插入是通过监听WM_DEVICECHANGE消息来实现的. 判断-U盘拔出和插入-获取它盘符 2010-05-04 10:59 加入 ...

  5. Windows下使用Qt检测U盘插入和拔出的示例Demo程序

    本文转载自Qt检测U盘插入拔出Demo 要做这个,要先知道Qt的QAbstractNativeEventFilter类,虚函数nativeEventFilter.这个类的主要作用是捕获全局window ...

  6. VMware虚拟机装系统时识别不出系统镜像文件(system not found / vmtool)

    1:先排除IOS镜像是否有问题 我一开始是在阿里云镜像下载的,出现找不到镜像,因为新版VMware已经不能使用从其他地方下载的镜像文件,之后在官网下的问题解决了(官网:获取Ubuntu服务器版 | U ...

  7. WPF中检测U盘插入、拔出 实例

    类代码: /// <summary>/// 声明一个委托,用于代理一系列自定义方法/// </summary>public delegate void FlashDiskDel ...

  8. QT:检测U盘插入和拔出(windows)

    1.先检测驱动器: 2.可以使用GetDriveType函数来获取驱动器的类型,以下是函数的链接: https://docs.microsoft.com/zh-cn/windows/win32/api ...

  9. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

最新文章

  1. 五点讲述C++智能指针的点点滴滴
  2. 『转载』|收藏|一张看懂AI知识体系
  3. 机器学习 KNN算法_0_丐版_鸢尾花集分类(matlab实现)
  4. Mybatis-数据插入
  5. Excel有哪些需要熟练掌握而很多人不会的技能!
  6. strip(),replace()和re.sub()用法
  7. 程序员杂志为啥没有了_计算机基础知识,程序员必备知识,java必会!新建一个TXT,发生了什么?...
  8. 编写tcp服务器发送hex格式_Android网络编程-TCP/IP协议
  9. 达梦数据库操作记录_【干货分享】达梦7与ArcGIS10.4进行安装适配详细步聚说明...
  10. HW RIPv2认证
  11. ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)
  12. HFSS19 官方中文教程系列Workshops L01
  13. POI数据获取-Python
  14. python爬虫实例(一) b站篇
  15. id2021中文直装版 v16.0附安装教程及软件特点
  16. 一篇文章带你了解国企程序员(超详细)
  17. 2(1) maximum number in a unimodal array
  18. 英语语法高考英语单词拼写必背全表
  19. Android混合开发(一)——移动端与前端交互之JSBridge引入
  20. 迁移操作系统:如何把系统迁移到固态硬盘SSD?

热门文章

  1. 地图随意搜---情景地图
  2. 数据库中关于preparedStatement和Statement分析
  3. 人脸识别的原理及技术
  4. 1.1.26 word内容导入PPT
  5. 星星泪用计算机怎么弹,星星泪简谱
  6. 金额格式化,符号位,保留两位小数
  7. 《可复制的领导力:樊登的9堂商业课》-樊登 读书笔记
  8. 图片识别——均值哈希算法
  9. 从头开始学Redisson--------限流器
  10. 风控中消费信贷板块的英文词汇