STM32之完成对SD卡的数据读取

一、SD卡的简介

SD存储卡是一种基于 半导体 快闪记忆器的新一代记忆设备,由于它体积小、 数据传输 速度快、可 热插拔 等优良的特性,被广泛地于便携式装置上使用,例如 数码相机 、 平板电脑 和 多媒体播放器 等。

二、SD卡引脚定义

在这里插入图片描述

三、实验过程

2.1 代码下载

链接:https://pan.baidu.com/s/1XTmLumQPlV6dUrWkSPc9pQ
提取码:i3qe

2.2 SD卡写入文件名和写入内容

char SD_FileName[] = "hello.txt";
uint8_t WriteBuffer[] = "马睿睿 631907030219 \r\n";

2.3 main函数

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_FATFS_Init();
  MX_USART1_UART_Init();
	
	HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); 	//enable uart	

	printf(" mian \r\n");

	Get_SDCard_Capacity();	//得到使用内存并选择格式化
  while (1)
  {
		WritetoSD(WriteBuffer,sizeof(WriteBuffer));	//写入SD卡	
		
		HAL_Delay(500);
		WriteBuffer[0] = WriteBuffer[0] +10;
		WriteBuffer[1] = WriteBuffer[1] +10; 
		write_cnt ++;
		while(write_cnt > 10)
		{	
			printf(" while \r\n");
			HAL_Delay(500);
		}		
  }
}

2.4 SD卡写入函数

void WritetoSD(BYTE write_buff[],uint8_t bufSize)
{
	FATFS fs;
	FIL file;
	uint8_t res=0;
	UINT Bw;	
	
	res = SD_init();		//SD卡初始化
	
	if(res == 1)
	{
		printf("SD卡初始化失败! \r\n");		
	}
	else
	{
		printf("SD卡初始化成功! \r\n");		
	}
	
	res=f_mount(&fs,"0:",1);		//挂载
	
//	if(test_sd == 0)		//用于测试格式化
	if(res == FR_NO_FILESYSTEM)		//没有文件系统,格式化
	{
//		test_sd =1;				//用于测试格式化
		printf("没有文件系统! \r\n");		
		res = f_mkfs("", 0, 0);		//格式化sd卡
		if(res == FR_OK)
		{
			printf("格式化成功! \r\n");		
			res = f_mount(NULL,"0:",1); 		//格式化后先取消挂载
			res = f_mount(&fs,"0:",1);			//重新挂载	
			if(res == FR_OK)
			{
				printf("SD卡已经成功挂载,可以进进行文件写入测试!\r\n");
			}	
		}
		else
		{
			printf("格式化失败! \r\n");		
		}
	}
	else if(res == FR_OK)
	{
		printf("挂载成功! \r\n");		
	}
	else
	{
		printf("挂载失败! \r\n");
	}	
	
	res = f_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);
	if((res & FR_DENIED) == FR_DENIED)
	{
		printf("卡存储已满,写入失败!\r\n");		
	}
	
	f_lseek(&file, f_size(&file));//确保写词写入不会覆盖之前的数据
	if(res == FR_OK)
	{
		printf("打开成功/创建文件成功! \r\n");		
		res = f_write(&file,write_buff,bufSize,&Bw);		//写数据到SD卡
		if(res == FR_OK)
		{
			printf("文件写入成功! \r\n");			
		}
		else
		{
			printf("文件写入失败! \r\n");
		}		
	}
	else
	{
		printf("打开文件失败!\r\n");
	}	
	
	f_close(&file);						//关闭文件		
	f_mount(NULL,"0:",1);		 //取消挂载
}

四、连线

SD卡 STM32
CS PA4
SCK PA5
MISO PA6
MISI PA7
VCC 5V
GUN GUN

在这里插入图片描述

五、编译并烧录

编译无误
在这里插入图片描述
烧录成功
在这里插入图片描述

六、实验验证

在这里插入图片描述
在这里插入图片描述
实验显示串口收到的数据,包括总内存、可使用内存以及已使用内存,SD卡初始化成功、挂载成功、文件写入成功等显示,若写入超过10次后,输出变为while。
在这里插入图片描述
使用读卡器打开SD卡可以看到里面生成了一个HELLO.TXT文件,里面的文件第一行正确,后面就会出现问题。

七、代码修改

对main函数进行修改如下,注释掉红框里面的代码:
在这里插入图片描述

八、结果显示

在这里插入图片描述

九、总结

实验并不难,但是需要细心,而且也需要有耐心,等待虽然很漫长,但是等来的结果会很让人快乐的。

十、参考

https://blog.csdn.net/m0_58414679/article/details/122036435?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/m0_46275263/article/details/122095003