新闻中心

EEPW首页>嵌入式系统>设计应用> 将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题

将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题

作者: 时间:2016-11-27 来源:网络 收藏

/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */

DRESULT disk_ioctl (
BYTE drv,/* Physical drive nmuber (0..) */
BYTE ctrl,/* Control code */
void *buff/* Buffer to send/receive control data */
)
{
DRESULT res;


if (drv)
{
return RES_PARERR; //仅支持单磁盘操作,否则返回参数错误
}

//FATFS目前版本仅需处理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三个命令
switch(ctrl)
{
case CTRL_SYNC:

res=RES_OK;
break;

case GET_BLOCK_SIZE:
*(WORD*)buff = 512;
res = RES_OK;
break;

case GET_SECTOR_COUNT:
*(DWORD*)buff = SD_GetCapacity();
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}

return res;
}

以上代码是参照网友的,当然原子的也没有问题。只要底层没有问题基本上,应用层就不会有问题。如何判别底层函数呢?在不加fatfs前跟踪调试一下看是否初始化能成功和其他的寄存器值是否能读成功。

在sd卡底层没有问题的情况下再做应用层函数的编写。

我在移植时没有使用内存管理机制,所以卡了好几天,一直以为是底层问题,可是读sd卡绝对没有问题,还能播放MP3呢。找不到问题所在头就大,后来在论坛上留言终于网友点醒了我,原来在定义FATFS *FS;是需要分配内存的,据说空间分配有两种方式一个是数组,另一个是定义指针,定义指针时要使用malloc分配内存还要free释放内存,而我定义了fatfs结构的指针没有分配内存,造成返回值FR_NO_FILESYSTEM,/* (13) There is no valid FAT volume */,后来我改成fatfs fs;还有一个问题sd卡的挂载驱动号是1 ,我写0res= f_mount(&fs,(TCHAR*)0,1); /* Mount a logical drive */;的时候老返回FR_INVALID_DRIVE,/* (11) The logical drive number is invalid */挂载失败。如果你也遇到这个问题建议改成res= f_mount(&fs,(TCHAR*)1,1);这种形式就行了,但是打开文件和读文件内容时还要这么写

res=exf_getfree("0:",&nCapacity,&free);//得到SD卡的总容量和剩余容量
res=f_open(&file, "0:/test.txt", FA_OPEN_EXISTING|FA_READ);
res=f_read (
&file, /* Pointer to the file object */
buffer,/* Pointer to data buffer */
512,/* Number of bytes to read */
&br/* Pointer to number of bytes read */
) ;

好了,废话不多说,把main函数应用层代码粘贴出来FATFS fs;
FIL file; //文件1
FIL ftemp; //文件2.
UINT br,bw;//读写变量
FILINFO fileinfo;//文件信息
DIR dir;
FILINFO fileInfo;
UINT br,bw;

FRESULT res;
u32 nCapacity;
char buffer[512];
int main(void)
{
u32 total,free;
BspInit();
res= SD_Init();

if(res==0)
{

DebugOut(0, "sd卡初始化成功!");
}

res= f_mount(&fs,(TCHAR*)1,1); /* Mount a logical drive */;
//f_mkfs(0,1,4096);
res=exf_getfree("0:",&nCapacity,&free);//得到SD卡的总容量和剩余容量
DebugOut(0,"总容量:%dKB,剩余容量:%dKB",nCapacity,free);
res=f_open(&file, "0:/test.txt", FA_OPEN_EXISTING|FA_READ);
res=f_read (
&file, /* Pointer to the file object */
buffer,/* Pointer to data buffer */
512,/* Number of bytes to read */
&br/* Pointer to number of bytes read */
) ;
DebugOut(0,"buffer:%s",buffer);
res= f_mount(NULL,(TCHAR*)1,1);
while(1);


}


上一页 1 2 下一页

评论


技术专区

关闭