在基于STM32 MCU的應用開發(fā)中,經(jīng)常會有人用到SD卡。有人發(fā)現(xiàn)在對SD卡進行讀寫時,偶爾會遇到SD卡讀寫失敗的情況。尤其是單獨對SD卡進行讀寫正常、或者非多任務環(huán)境下運行正常,而當SD讀寫跟其它程序代碼混在一起或在多任務環(huán)境下運行時就容易發(fā)生異常。比方如下情形:
1、使用STM32F4的SDIO,用CubeMX配置。用polling模式的時候,出現(xiàn)SD卡寫的時候卡死的情況。后來用DMA模式就好了。
2、STM32F746DISCO開發(fā)板和官方1.3.0例程基礎上使用了FreeRTOS系統(tǒng),改為DMA傳輸后還是不穩(wěn)定。后來把SDIO相關的中斷優(yōu)先級別調(diào)高,SDIO中斷設為3,DMA發(fā)送和接收的調(diào)為4,比FreeRTOS的系統(tǒng)用戶級別高,解決問題。
3、在FreeRTOS+FatFs+STM32F429的基礎上。
A.單個任務操作,SD卡讀寫沒有問題
B.多個任務,SD卡和U盤兩個任務,優(yōu)先級別一樣,SD卡無法讀寫,U盤可以讀寫,調(diào)中斷級別,調(diào)整堆棧大小都沒有用。
C.還是多任務,SD卡和U盤兩個任務,甚至更多任務,只要把SD卡任務的優(yōu)先級別調(diào)為最高,則SD卡,U盤讀寫都正常。
4、使用STM32官方SDIO的SD CARD驅(qū)動的時候,單任務的時候沒有出現(xiàn)錯誤,使用多任務的時候經(jīng)常出現(xiàn)問題,表現(xiàn)為讀取文件的時候沒有問題,經(jīng)常點擊屏幕的時候就會出問題,最后通過仿真找到出錯點就是讀取數(shù)據(jù)向SD卡發(fā)送CD17命令時出現(xiàn)SD_RX_OVERRUN這個錯誤,產(chǎn)生原因為讀取FIFO溢出. 通過仿真與測試發(fā)現(xiàn)問題主要出現(xiàn)在讀取過程中不能打斷。
在兩個讀取函數(shù)里面SD_ErrorSD_ReadMultiBlocks(u32 addr, u32 *readbuff, u16 BlockSize, u32NumberOfBlocks);SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16BlockSize); 加上臨界保護可以消除問題。同樣寫操作的時候也一樣需要加臨界保護。
以上羅列的情形,根本上講因為SD卡讀寫過程中發(fā)生了超時錯誤導致讀寫異常。應對措施視具體應用要求可能有所差異,最終目的都是為了避免SD卡讀寫過程中的超時錯誤。比如將查詢模式改為DMA模式、調(diào)整相關SD卡讀寫過程中所涉及中斷的優(yōu)先級、提升SD卡讀寫任務的優(yōu)先級、將SD卡讀寫程序放在臨界保護區(qū)運行或者在讀寫SD卡操作時關閉中斷等。
我們可以從SD卡相關協(xié)議得知,在對SD卡進行讀寫操作時是有超時保護及約束機制的。對于標準卡和高容量卡的讀寫超時定義還有所差異。細節(jié)請參考SD卡相關規(guī)格書。SD Specifications ----Physical Layer Simplified Specification。



|