STM32+UCOSII+U盘出错问题

平台

芯片:STM32F767IGT6
存储:读卡器+2G/8G 卡,U盘
文件系统:FATFS R0.12a
操作系统:UCOSII V1.30.02
参考:正点原子例程
使用的其他外设:SDIO,网络LWIP,SDRAM,USB从设备,LTDC

问题

问题1:

U盘f_mount有时挂载不上,在挂载处,err返回值是0X01,根据返回值数值可确定是FR_DISK_ERR,
有时挂载上了,f_open或者f_write返回FR_DISK_ERR
如图
在这里插入图片描述

问题 2:

有时卡死,卡死的代码是f_mount或者f_open或者f_write或者f_read。一直在FATFS的某个循环中,具体哪个我忘记了,只知道有个返回代码是MSC_READ_BUSY。

体现

有时挂载不上,有时能挂载上,但是在其他地方出错,比较没规律,特别的是会卡死一直返回
MSC_READ_BUSY

相关代码:

STM32+UCOSII+U盘出错问题_第1张图片

STM32+UCOSII+U盘出错问题_第2张图片

解决

  1. 造成假象是我以为是移植进FATFS时的底层函数,disk_read那里出了问题,因为进入后最终是disk_read那里返回值错误。
    U盘的枚举函数USBH_Process不宜太快,因此这里是1ms一次。
    STM32+UCOSII+U盘出错问题_第3张图片

  2. 由于使用了UCOSII,进入中断前和退出中断必须加入这两条语句,因此USB中断代码更改为:
    STM32+UCOSII+U盘出错问题_第4张图片

  3. 重点处
    USB_HANDLE_INIT的作用是进行USB的初始化,如下
    在这里插入图片描述而它的使用是在起始任务中,需要注意的是在该函数初始化USB时,是关中断----初始化----开中断
    STM32+UCOSII+U盘出错问题_第5张图片
    因此,将它注释掉,改为在Main函数中调用(其实在起始任务也可以,但是不要关中断去初始化USB)

思考

由于对USB不熟悉,因此在这里抛砖引玉。
U盘的枚举不宜太快执行,要有间隔时间,且USB初始化时会进行USB硬件的检测,其中会进行一些通信而进入中断,由于关中断后初始化不会进入USB中断通信,因此出现问题。
当然UCOSII进入中断还是遵循其使用原则,加入那两个函数。

通过以上解决了此问题,能正常使用。当然不一定出现这个错误就能适用,希望能给遇到类似问题的同行进行参考。

你可能感兴趣的:(STM32)