挂载文件系统SD卡读写

使用软件:stm32cubemx
开发板:野火指南者stm32f103vet6
HAL库;STM32Cube FW_F1 V1.8.0
实现功能:串行flash模拟u盘

先用STM32CubeMX生成代码
需要:
1.RCC
2.SYS
3.SDIO
4.USART1(调试用)
5.FATFS(SD Card)
需要配置中断:无
在这里插入图片描述
在这里插入图片描述
设置 SDIOCLK clock divide factor (一般设置4-8) 在这里插入图片描述

这是对应的标准库sd卡的配置
在这里插入图片描述
设置异步通信模式在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成代码

1…在usart.c重定向printf,方便给调试

需要加上stdio.h文件

#include "stdio.h"
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  return ch;
}

2.在main.c里写用户程序
在这里插入图片描述

FATFS fs;													/* FatFs文件系统对象 */
FIL file;													/* 文件对象 */
BYTE ReadBuffer[255]={0};								/*读缓冲区*/
BYTE WriteBuffer[20]="11111";								/*写缓冲区*/

首先要了解几个函数
f_mount 挂载文件系统
f_open 打开文件 查看f_open函数发现fp->fptr = 0;fp->dsect = 0;调用后每次打开文件会将指针清零,所以每次都从头写。
f_lseek 此函数用于文件指针的移动,共有两个参数,第一个参数为文件对象,第二个参数为移动的字节数,注意第二个参数是相对于文件的开始.
f_close 关闭文件
在这里插入图片描述
上代码

void SD_Write_Test(void)
{
	int res = 0;
	UINT write_num = 0;
	
	res = f_mount(&fs,"0:",1);            //挂载文件系统
	if(res != FR_OK)
	{
		printf("f_mount is error,error code is ;%d\r\n",res);
	}
	
	else
	{
		printf("f_mount is successed! test open file\r\n");
		res = f_open(&file,"test.txt",FA_READ|FA_WRITE|FA_OPEN_ALWAYS);
		
		int FileSize = f_size(&file);
		if(res != FR_OK)
		{
			printf("f_open is error,error code is ;%d\r\n",res);
		}
		else
		{
			if(FileSize>3) 							//就算文件里没有数据,也算是有一个字节,所以要判断一下,防止文件为空时移动
			{
				res=f_lseek(&file,FileSize); 
							if(res != FR_OK)
							{
							printf("f_lseek is error,error code is ;%d\r\n",res);
							}
							
			}
			res = f_write(&file,WriteBuffer,sizeof(WriteBuffer),&write_num);
			res = f_write(&file,"\r\n",sizeof("\r\n"),&write_num);
			if(res != FR_OK)
			{
				printf("f_write is error,error code is ;%d\r\n",res);
			}
			else{
				printf("TRUE write word to file size is :%d\r\n",write_num);
			}
			


			res = f_close(&file);
			if(res != FR_OK)
			{
				printf("f_close is error,error code is ;%d\r\n",res);
			}
			else
			{
				printf("f_close is successed!\r\n");
			}
		}
	}
}
void SD_read_Test(void)
{
	int res = 0;
	UINT write_num = 0;
	res = f_mount(&fs,"0:",1);            //挂载文件系统
	res = f_open(&file,"test.txt",FA_READ|FA_WRITE|FA_OPEN_ALWAYS);

	res = f_read(&file,ReadBuffer,100,&write_num);
			if(res != FR_OK)
			{
				printf("f_read is error,error code is ;%d\r\n",res);
			}
					else{
				printf("TRUE read word to file size is :%d\r\n %s\r\n",write_num,ReadBuffer);
			}

	res = f_close(&file);
}

别忘了在main函数之前定义一下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以和模拟U盘一起使用,当USB DEVICE与电脑连接时,停止向sd卡写数据。

[stm32Cubemx sd卡模拟U盘]
模拟U盘和FATFS冲突问题


版权声明:本文为borli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>