挂载文件系统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卡写数据。
版权声明:本文为borli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。