记录一下自己遇到的问题:
程序中用到了按键中断、定时器中断、SDIO中断、DMA中断,优先级为:DMA中断>SDIO中断>按键中断>定时器中断。在运行程序的过程中发现程序卡死在SD_WaitReadOperation()中的:
while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0))
{
timeout--;
}
调试过程中,发现程序一直在while循环中跳不出去,其他变量都是没问题的,只有timeout变量一直>0。
解决:后来先是检查了SD卡的驱动,发现没有问题;再在主函数的没有中断处运行f_read()函数发现读写都是正常的。这时开始怀疑是中断的问题,重新梳理了中断中断分组和中断优先级: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 发现程序多次设置了中断分组,造成中断分组混乱,把驱动.c文件中的 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)注释掉,只在主函数中设置一次中断分组就可以了。
参考:我们设置中断优先级分组只设置一次,在代码开头处设置,设置完分组后不要随意更改,避免中断管理混乱 作者:向洋2333 https://www.bilibili.com/read/cv17093270 出处:bilibili