STM32 SDIO 報(bào)錯(cuò) SD_RX_OVERRUN
掃描二維碼
隨時(shí)隨地手機(jī)看文章
使用STM32官方SDIO 的SDCARD驅(qū)動(dòng)的時(shí)候,以前單任務(wù)的時(shí)候沒有出現(xiàn)這種錯(cuò)誤,現(xiàn)在使用多任務(wù)的時(shí)候經(jīng)常出現(xiàn),表現(xiàn)為讀取文件的時(shí)候沒有問題,經(jīng)常點(diǎn)擊屏幕的時(shí)候就會(huì)出問題,最后通過仿真找到出錯(cuò)點(diǎn)就是讀取數(shù)據(jù)向SD卡發(fā)送CD17命令時(shí)出現(xiàn)SD_RX_OVERRUN這個(gè)錯(cuò)誤,產(chǎn)生原因?yàn)樽x取FIFO溢出.
通過仿真與測試發(fā)現(xiàn)問題主要出現(xiàn)在讀取過程中不能打斷,也就是臨界點(diǎn).
在兩個(gè)讀取函數(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)中斷
同樣寫操作的時(shí)候也一樣需要.
因?yàn)橛行┩庠O(shè)的操作時(shí)不能被打斷的.