RT-Thread:STM32F407虚拟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盘。这个就很简单啦~~
在这里插入图片描述

总结

一天过去了,飘落的秀发就和时间一样,无法挽回!我又能怎样呢?我可以回去躺尸~~
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
RT-Thread是一个开源的实时操作系统,可以在各种嵌入式设备上运行。STM32F407VE是STMicroelectronics推出的一款基于ARM Cortex-M4内核的微控制器。 RT-Thread可以运行在STM32F407VE上,使用RT-Thread可以更好地管理系统资源和任务,提高实时性和稳定性。STM32F407VE具有丰富的外设和强大的计算能力,可以适用于各种应用场景。 在RT-Thread上运行的应用程序可以通过它的内核提供的丰富API来进行多任务处理、线程管理、内存管理等操作。它还提供了灵活的驱动框架和硬件抽象层,方便开发人员进行底层驱动开发和应用程序开发。 RT-Thread还提供了一套完善的文件系统,可以对外部存储器进行读写操作,方便数据的存储和管理。此外,RT-Thread还支持网络协议栈,可以实现与其他设备的通信和数据传输。 对于STM32F407VE这款微控制器来说,它具有丰富的外设,例如UART、SPI、I2C等,可以实现与外部设备的连接和通信。同时,它还具有硬件浮点运算单元,可以提高计算能力。 在使用RT-Thread开发STM32F407VE时,我们可以充分利用STM32F407VE的硬件资源,通过合理的任务划分和优化,提高系统的实时性和效率。同时,我们也可以利用RT-Thread提供的各种功能和工具,方便地进行开发、调试和测试。 总之,RT-ThreadSTM32F407VE都是非常强大的工具,它们的结合可以为嵌入式开发带来很多便利和效益。无论是在学习、研究还是商业开发中,它们都具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小破孩 != ERR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值