SDIO_FATFS_MDK 調(diào)試記錄
首先要說(shuō)一個(gè)問(wèn)題,就是在寫(xiě)文件(f_write)的時(shí)候跳硬件中斷的問(wèn)題。堆棧不夠,使用的開(kāi)發(fā)板是奮斗v3.0,芯片是stm32f103vet6,有64K的ram,但是在startup_stm32f10x_hd.s的啟動(dòng)代碼文件里對(duì)堆棧的定義卻很小,不知道為什么,是因?yàn)閯e的硬件資源自己去分配么?現(xiàn)在還沒(méi)有搞明白。下面有圖為證:
原來(lái)是512個(gè)字節(jié),現(xiàn)在我把他修改成了2048個(gè)字節(jié)(2kb)。就可以使用了,在Fatfs操作過(guò)程中,他的每一個(gè)寫(xiě)操作的單位就是512字節(jié),堆棧也是512字節(jié),自然會(huì)溢出沒(méi)得說(shuō),然后程序就會(huì)跳到硬件中斷那里歇著去了。
另外一個(gè)問(wèn)題,在寫(xiě)操作的時(shí)候程序會(huì)在SD卡的寫(xiě)操作上面死掉,現(xiàn)在還找到原因,需要仔細(xì)看下DMA和SDIO直接的訪問(wèn)情況。
給注釋掉就可以正常的寫(xiě)文件了。
2011年1月12日 11:40:54
下面寫(xiě)下我的理解和解決辦法:
首先分析了下代碼造成在上述地方程序死循環(huán)的不是下面的讀操作而是寫(xiě)操作的f_close()函數(shù)。
在sdcard.c文件的開(kāi)始定義了volatile SD_Error TransferError = SD_OK;(即0x2A)
那么分析這句話的意思
while ((TransferEnd == 0) && (TransferError == SD_OK))
{}
{}
當(dāng)傳輸結(jié)束并且沒(méi)有錯(cuò)誤的時(shí)候進(jìn)入死循環(huán)?!說(shuō)不通啊,但是在IAR的編譯器里就可以運(yùn)行,現(xiàn)在要查找從定義到死循環(huán)之間有沒(méi)有什么操作可以改變這兩個(gè)變量的值。初步看沒(méi)有什么會(huì)變化的情況,要對(duì)照IAR的仿真運(yùn)行一起看。
問(wèn)題已經(jīng)解決,要謝謝網(wǎng)友stm32!
要在stm32f10x_it.c里把SDIO的中斷服務(wù)函數(shù)加上,
/*******************************************************************************
* Function Name : SDIO_IRQHandler
* Description : This function handles SDIO global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SDIO_IRQHandler(void)
{
SD_ProcessIRQSrc();
}
* Function Name : SDIO_IRQHandler
* Description : This function handles SDIO global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SDIO_IRQHandler(void)
{
SD_ProcessIRQSrc();
}
然后就ok了。
評(píng)論