STM32 SDIO 報錯 SD_RX_OVERRUN
使用STM32官方SDIO 的SDCARD驅(qū)動的時候,以前單任務(wù)的時候沒有出現(xiàn)這種錯誤,現(xiàn)在使用多任務(wù)的時候經(jīng)常出現(xiàn),表現(xiàn)為讀取文件的時候沒有問題,經(jīng)常點(diǎn)擊屏幕的時候就會出問題,最后通過仿真找到出錯點(diǎn)就是讀取數(shù)據(jù)向SD卡發(fā)送CD17命令時出現(xiàn)SD_RX_OVERRUN這個錯誤,產(chǎn)生原因?yàn)樽x取FIFO溢出.
通過仿真與測試發(fā)現(xiàn)問題主要出現(xiàn)在讀取過程中不能打斷,也就是臨界點(diǎn).
在兩個讀取函數(shù)里面
SD_Error SD_ReadMultiBlocks(u32 addr, u32 *readbuff, u16 BlockSize, u32 NumberOfBlocks);
SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16 BlockSize);
關(guān)鍵點(diǎn)加上臨界保護(hù)
OS_ENTER_CRITICAL();//關(guān)閉系統(tǒng)中斷
while(!(SDIO->STA&(SDIO_FLAG_RXOVERR|SDIO_FLAG_DCRCFAIL|SDIO_FLAG_DTIMEOUT|SDIO_FLAG_DBCKEND|SDIO_FLAG_STBITERR)))
{
if(SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF)!=RESET)
{
for(count=0;count<8;count++)
{
*(tempbuff+count)=SDIO_ReadData();
}
tempbuff+=8;
}
}
OS_EXIT_CRITICAL();//開啟系統(tǒng)中斷
同樣寫操作的時候也一樣需要.
因?yàn)橛行┩庠O(shè)的操作時不能被打斷的.