基于FATFS的SD卡存储

FATFS介绍

FAT File System是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到资源有限的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。
FAFTS文件系统描述

配置流程

SDIO_Init()

SDIO是底层驱动,要想使用FATFS需要配置底层驱动,可以是SD卡,也可以是外部SRAM,当然SD卡也可以试用SPI通讯。根据硬件原理图配置接口以及中断优先级

SD_Error SD_Init(void)
{
   
   
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	u8 clkdiv=0;
	SD_Error errorstatus=SD_OK;	 
  
	//SDIO IO口初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//使能PORTC,PORTD时钟
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO|RCC_AHBPeriph_DMA2,ENABLE);//使能SDIO,DMA2时钟	 
  
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;	//PC.8~12 复用输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 		 //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOC, &GPIO_InitStructure);					 //根据设定参数初始化PC.8~12 
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	//PD2 复用输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 		 //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOD, &GPIO_InitStructure);					 //根据设定参数初始化PD2

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	//PD7 上拉输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOD, &GPIO_InitStructure);					 //根据设定参数初始化PD7
 
 	//SDIO外设寄存器设置为默认值 			   	   
	SDIO_DeInit();
 
	NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;			//SDIO中断配置
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级0 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;					//子优先级0 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
	NVIC_Init(&NVIC_InitStructure);  	  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	errorstatus=SD_PowerON();			//SD卡上电
 	if(errorstatus==SD_OK)
		errorstatus=SD_InitializeCards();			//初始化SD卡	
	
	if(errorstatus==SD_OK)
		errorstatus=SD_GetCardInfo(&SDCardInfo);	//获取卡信息
	
 	if(errorstatus==SD_OK)
		errorstatus=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡
	
	if(errorstatus==SD_OK)
		errorstatus=SD_EnableWideBusOperation(1);	//4位宽度,如果是MMC卡,则不能用4位模式 
	
	if((errorstatus==SD_OK)||(SDIO_MULTIMEDIA_CARD==CardType))
	{
   
     		    
		if(SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V2_0)
		{
   
   
			clkdiv=SDIO_TRANSFER_CLK_DIV+6;	//V1.1/V2.0卡,设置最高72/12=6Mhz
		}
		else clkdiv=SDIO_TRANSFER_CLK_DIV;	//SDHC等其他卡,设置最高72/6=12Mhz
		SDIO_Clock_Set(clkdiv);				//设置时钟频率,SDIO时钟计算公式:SDIO_CK时钟=SDIOCLK/[clkdiv+2];其中,SDIOCLK固定为48Mhz 
		//errorstatus=SD_SetDeviceMode(SD_DMA_MODE);	//设置为DMA模式
		errorstatus=SD_SetDeviceMode(SD_POLLING_MODE);	//设置为查询模式
 	}
	return errorstatus;		 
}

diskio.c的配置

这个.c文件里主要是一些API函数,需要我们自己把接口补充上,共有以下五个函数:

DSTATUS disk_initialize (BYTE pdrv);
DSTATUS disk_status (BYTE pdrv);
DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);

下面是具体实现代码

#define SD_CARD	 0  //SD卡,卷标为0
	  
//获得磁盘状态
DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
   
    
	return RES_OK;
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值