问题描述:
使用官方的USB驱动库,然后根据网上资料说的把该修改的地方修改了,按理说插上USB就应该能被电脑识别,但是实际测试发现一直无法识别。后面用cubemx生成该功能代码,并进行修改也不行,网上查找的资料很多是通过cubemx直接生成的,而且生成之后能直接使用。
解决办法:
经过调试发现程序运行后最后会卡死在SDIO_PowerState_ON()函数中的“Hal_Delay(2)”这个语句中,位于SD卡的初始化函数中,而USB在HAL_PCD_SetupStageCallback()回调函数中会调用SD卡初始化函数,这个调用关系就会出现中断优先级嵌套问题,Hal_Delay依靠SysTick_Handle()中断服务函数,而USB回调函数又是被OTG_FS_IRQHandler()中断服务函数调用,因此当USB的中断优先级比Systick高时,会导致死在Hal_Delay中,因为Systick中断被高优先级的USB中断抢占了,导致无法延时。因此解决办法有如下几种:
1、将systick的中断优先级调整到比USB优先级更高
2、将Hal_Delay用定时器实现,但是建议不使用中断。
3、提前将SD卡初始化,然后用一个标志指示是否初始化。这样USB调用初始化时直接返回成功。
推荐使用第三种方法。
版权声明:本文为qq_27718231原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。