STM32 + SDIO + FATFS 调试记录

首先要说一个问题,就是在写文件(f_write)的时候跳硬件中断的问题。堆栈不够,使用的开发板是奋斗v3.0,芯片是stm32f103vet6,有64K的ram,但是在startup_stm32f10x_hd.s的启动代码文件里对堆栈的定义却很小,不知道为什么,是因为别的硬件资源自己去分配么?现在还没有搞明白。下面有图为证:

STM32 + SDIO + FATFS 调试记录_第1张图片
 
原来是512个字节,现在我把他修改成了 2048个字节(2kb)。就可以使用了,在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。

另外一个问题,在写操作的时候程序会在SD卡的写操作上面死掉,现在还找到原因,需要仔细看下DMA和SDIO直接的访问情况。

STM32 + SDIO + FATFS 调试记录_第2张图片
 
给注释掉就可以正常的写文件了。
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了。

转自: http://blog.163.com/wanghengzhi@126/blog/static/168853652201011171719625/

你可能感兴趣的:(function,input,编译器,output,2010)