在使用STM32讀取SD Card的文件時,總是會卡死在讀函數那里
res = f_read(&fsrc, gbuffer, sizeof(gbuffer)-1, &br);
而且出現很奇怪的現象。若是我只定義全局變量
BYTE gbuffer[TEMP_SIZE];// file copy gbuffer,8-bit
那么程式必定會卡死。
若是我定義兩個全局變量
BYTE gbuffer[TEMP_SIZE];// file copy gbuffer,8-bit
BYTE temp[TEMP_SIZE];//for log record
還是只用到gbuffer,temp只是定義並不使用,這時程式就會OK。這是問題一
這在邏輯上完全說不通,我沒有使用到temp,只是定義了而已,為什么會影響到gbuffer呢?
於是調試程式,發現程式最終卡死在sdcard.c中的一個while循環里面。
else if (DeviceMode == SD_INTERRUPT_MODE)
{
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE);
while ((TransferEnd == 0) && (TransferError == SD_OK))
{
}
if (TransferError != SD_OK)
{
return(TransferError);
}
}
跳出while循環的兩個條件TransferEnd和TransferError值的改變都是在SD卡的interrupt服務程序里面。
在interrupt里面設置斷點,發現程式根本沒有進去。但是gbuffer里面的值都有變化。
意思也就是說,讀SD card都正常,但是就是不進中斷。
為什么不進中斷?我把所有觸發中斷的條件都打開了。這是問題二。
綜合問題一和二,我發現從程序邏輯上來分析已經講不通了。於是想到了棧的大小。。。
嘗試着把Stack_Size EQU 0x00000200
改為Stack_Size EQU 0x00000800
結果,程式再也不會卡死了,數據也能正常讀取。。。。
雖然問題解決了,但是問題出現的根本原因還是不清楚,大概推斷是堆棧溢出了。中斷服務程序是要
使用MSP主堆棧的。在堆棧溢出的情況下,中斷服務程序的PC就找不到了,或者發生了其他問題,所以程序就跑飛了。
以下摘自 《CM3權威指南》,關於中斷服務程序和堆棧的描述
進入中斷后,入棧的8個字。