| 原来是需要在这种情况下由软件复位 USB 啊。 于是接下来处理方法就变得很简单 :
 1> USB 初始化时需要将 OTG_DCFG.ERRATIM=0,确保 USB 内核检测到错误时可以产生 Early
 suspend 中断.
 2> USB 初始化时确保使能 Early suspend 中断: OTG_GINTMSK.ESUSPM =1
 3> 在 USB 中断处理函数中,在 Early suspend 中断时,判断当前 OTG_DSTS.EERR 是否为 1,如果
 是,则表示出现了错误,此时需要将 USB 内核复位一下。
 4> 具体 USB 内核复位过程建议先对 USB 做默认初始化,再通过 RCC 时钟控制单元单独切断 USB
 的时钟再恢复,这样 USB 所有寄存器状态都能恢复到初始状态,然后再重新将 USB 初始化一
 遍。
 通过以上修改后当问题再现时,新增加的还原操作能将 USB 内核恢复到正常工作状态,最
 终解决了问题。
 至于为什么 USB 内核会检测到莫名的错误, 这里认为可能是在多次 USB 插拔的过程中,由
 于电气方面的原因导致那一堆乱码, 这个不太好量化。 好在我们基于微处理器的相关出错提示确
 实能解决该问题,不失为一种解决问题的参考。
 
 
 |