stm32之SD(TF)卡、SDIO、FATFS的使用学习(笔记二)[接学习笔记一]

SD卡数据的写入或者读取,需要将数据写入SDIO的FIFO寄存器,然后通过FIFO寄存器进行数据的发送。FIFO寄存器是32位的寄存器,操作 SDIO_FIFO(不论读出还是写入)必须是以 4 字节对齐的内存进行操作,否则将导致出错!无论哪个函数,其数据 buf 的地址都必须是 4 字节对齐的!buf是为了写入数据或者读出数据而创建的缓存区的首地址指针

所以下面写入代码会对buf进行判断,判断buf的地址是不是四字节对其的。

if((uint32_t)buf%4!=0) //判断buf指针的内存四不是4字节对齐的。

{

printf("buf地址 是四字节对其的");

}

/* 下面是SRAM的32字节对齐的设置示例 */

__align(32) u8 mem2baseMEM2_MAX_SIZE attribute((at(0X68000000))); //外部SRAM内存池

3.2、SD卡数据的写入

SD卡的数据写入分为单个block块的写入,多个block块的写入。许多的SD卡的配置和SDIO的配置都是在写入函数中配置的。例如SD卡的block块的大小,SD卡的数据总线的数量,SD卡的DMA模式的收发配置等都是在收发sd数据的函数中进行配置的。

下面是sd卡的写block块的函数,该函数是调用SD卡的写一个或者多个block块的函数,此函数的封装是为了对接FATFS文件系统的内存管理接口的函数,对接需要三个参数,读写数据的缓冲区指针,写入那个内存块,写多少个内存块。

cpp 复制代码
//写SD卡
//buf:写数据缓存区
//sector:扇区地址,根据512字节块进行增加的
//cnt:扇区个数	
//返回值:错误状态;0,正常;其他,错误代码;	
uint8_t SD_WriteBlock(uint8_t*buf,uint32_t block,uint8_t cnt)
{
	uint8_t re_status=SD_OK;
	uint8_t n;
	long long llblock=block;
	if(SD_CardInfo.CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)
		llblock<<=9;
	//因为SDIO的FIFO寄存器为32位,4个字节,所以写入的字节数必须是4的倍数,如果不是就进行填充
	//所以需要下面的判断
	if((uint32_t)buf%4!=0)     //判断buf地址是不是4的余数
	{
	 	for(n=0;n<cnt;n++)
		{
			/* 从这里的512就可以判断卡的block的大小 */
			memcpy(Sdio_Data_Buffer,buf,512);   //因为SDIO的FIFO寄存器为32位,4个字节,所以写入的字节数必须是4的倍数,如果不是就进行填充
		 	re_status=My_SD_MMC.Write_OneBlock(Sdio_Data_Buffer,llblock+512*n,512);  //单个sector的写操作
			buf+=512;
		} 
	}else
	{
		if(cnt==1)
			re_status=My_SD_MMC.Write_OneBlock(buf,llblock,512);    	  //单个sector的写操作
		else 
			re_status=My_SD_MMC.Write_MultiBlocks(buf,llblock,512,cnt);   	//多个sector   
	}
	return re_status;
}

下面将针对sd卡写入多个内存块和写入单个内存块的函数进行讲解。

3.2.1、写入单个内存块

写入单个内存块的函数如下所示

/*

(1) @buf:写入数据的指针,必须是4字节地址对齐的。

(2) @addr:写入sd卡的地址,数据地址从0开始,一个地址对应一个字节byte。

(3) @blksize:sd卡的写入读出的块的大小,单位byte。

*/

SD_Error Write_OneBlock(uint8_t *buf, long long addr, uint16_t blksize);

下面是函数的流程图:

3.2.2、写入多个内存块

3.3、SD卡数据的读取

相关推荐
我命由我123452 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime
乐橙开放平台3 小时前
养老 SaaS 笔记:setMessageCallback 事件桥接 + msgType 映射 P0/P1,先 ACK 再分流值班流
笔记·物联网·音视频·智能家居
Logintern093 小时前
【每天学习一点点】MPI是什么?
学习·mpi·多机训练
fengci.3 小时前
提示词注入学习小结
学习
我不管我就要叫小猪3 小时前
STM32——SPI
stm32·单片机·嵌入式硬件
晓梦林3 小时前
Tools2靶场学习笔记
笔记·学习
捷瑞电子工坊4 小时前
深入理解CMSIS内核函数:__disable_irq() 与 __enable_irq()
stm32·嵌入式系统·cmsis·中断控制·临界区保护
paopaokaka_luck5 小时前
基于springboot3+vue3的车间生产管理系统(Echarts图形化分析、BI报表)
java·前端·spring boot·学习·echarts
Canmag 兴隆磁性5 小时前
自动磁场分布测试+镭雕设备 AT-C
学习·永磁材料·磁场分布测试
LCG元5 小时前
【实战】STM32 从零实现 Modbus RTU 从站:寄存器映射、CRC 校验与串口中断解析
stm32·单片机·嵌入式硬件