STM32 + SDIO + FATFS 調試記錄

首先要說一個問題,就是在寫文件(f_write)的時候跳硬件中斷的問題。堆棧不夠,使用的開發板是奮鬥v3.0,芯片是stm32f103vet6,有64K的ram,但是在startup_stm32f10x_hd.s的啓動代碼文件裏對堆棧的定義卻很小,不知道爲什麼,是因爲別的硬件資源自己去分配麼?現在還沒有搞明白。下面有圖爲證:

SDIO_FATFS_MDK 調試記錄 - 豆子 - 代碼豆子
 
原來是512個字節,現在我把他修改成了 2048個字節(2kb)。就可以使用了,在Fatfs操作過程中,他的每一個寫操作的單位就是512字節,堆棧也是512字節,自然會溢出沒得說,然後程序就會跳到硬件中斷那裏歇着去了。

另外一個問題,在寫操作的時候程序會在SD卡的寫操作上面死掉,現在還找到原因,需要仔細看下DMA和SDIO直接的訪問情況。

SDIO_FATFS_MDK 調試記錄 - 豆子 - 代碼豆子
 
給註釋掉就可以正常的寫文件了。

2011年1月12日 11:40:54
下面寫下我的理解和解決辦法:
首先分析了下代碼造成在上述地方程序死循環的不是下面的讀操作而是寫操作的f_close()函數。
在sdcard.c文件的開始定義了 volatile SD_Error TransferError = SD_OK;(即0x2A)
那麼分析這句話的意思
    while ((TransferEnd == 0) && (TransferError == SD_OK))
    {}
當傳輸結束並且沒有錯誤的時候進入死循環?!說不通啊,但是在IAR的編譯器裏就可以運行,現在要查找從定義到死循環之間有沒有什麼操作可以改變這兩個變量的值。初步看沒有什麼會變化的情況,要對照IAR的仿真運行一起看。

問題已經解決,要謝謝網友stm32!
要在stm32f10x_it.c裏把SDIO的中斷服務函數加上,注意要開啓SD中斷允許!
/*******************************************************************************
* 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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章