使用cubemx建立一个fatfs文件系统操作SD卡

序言

  • 新建工程
    • 软件版本
      • 时钟配置
      • SDIO配置
      • FATFS配置
    • 代码配置
      • 测试配置
    • 工程链接

最近想做一个操作sd卡的文件系统,选择用cubemx来进行建立工程,这样的话如果需要添加新的底层初始化代码的话方便修改。

新建工程

首先需要准备一个新的工程,SD卡这里的话,有spi协议跟sd卡的4线或8线的协议,我的迷你开发板上所能有的接入SD卡的硬件采用的是4线的SD协议。
所以这回就以4线的SD协议来建立一个文件系统吧。

软件版本

cubemx6.1.2 MDK5.33.0.0 芯片用的是stm32f103zet6

时钟配置

时钟还是采用最高配置
ykun1

SDIO配置

由原理图可以看到采用的4线SD协议,且没有SD卡插入检测引脚。
ykun3

配置的时候我遇到一个坑,第二个箭头设置时钟分频默认是0,但这样不行,文件系统挂载的时候会报错,得分频一下。选择6的话很稳定。
ykun2

FATFS配置

接下来配置文件系统,在code page可以选择中文,当然,这次测试为文件名没有超过8个字符,所以没有必要配置下面的长文件名。
ykun4
由于只有1个盘所以VOLUMES选择1即可,SD卡的最小操作空间512,选择默认的即可;其他配置也默认。
ykun5

代码配置

生成工程后配置代码即可,首先是串口打印配置代码。在usart.c文件里面添加printf代码。

/* USER CODE BEGIN 0 */
#include "stdio.h"struct __FILE 
{ int handle; }; FILE __stdout;    int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);return ch;
}
/* USER CODE END 0 */

测试配置

测试文件添加全局变量

/* USER CODE BEGIN 0 */FATFS fs;                       // FatFs 文件系统对象 
FIL file;                       // 文件对象 
FRESULT f_res;                  // 文件操作结果 
UINT fnum;                      // 文件成功读写数量 
BYTE ReadBuffer[128] = {0};     // 读缓冲区 
BYTE WriteBuffer[] =            // 写缓冲区"123456ykun@张三;\r\n";
/* USER CODE END 0 */

主函数中添加测试代码,包括初始化、写、读测试

  /* USER CODE BEGIN 2 */printf("\r\n******This is FatFs Example ******\r\n\r\n");//文件格式化测试f_res = f_mount(&fs, "0:", 1);//在外部 SD 卡挂载文件系统,文件系统挂载时会对 SD 卡初始化if(f_res == FR_NO_FILESYSTEM)//如果没有文件系统就格式化创建创建文件系统{printf("SD卡不存在文件系统\r\n");f_res = f_mkfs("0:", 0, 0);//格式化if(f_res == FR_OK){printf("创建SD卡文件系统成功\r\n");f_res = f_mount(NULL, "0:", 1);//取消挂载 f_res = f_mount(&fs, "0:", 1);//重新挂载创建的文件系统}else{printf("格式化失败\r\n");while(1);}}else if(f_res != FR_OK){printf(" f_mount error : %d \r\n", f_res);while(1);}else{printf(" f_mount sucess!!! \r\n");}//写文件f_res = f_open(&file, "0:CUBE.txt", FA_CREATE_ALWAYS | FA_WRITE);//如果文件不存在则创建if(f_res == FR_OK){printf(" open file sucess!!! \r\n");f_res = f_write(&file, WriteBuffer, sizeof(WriteBuffer), &fnum);//写入文件内容if(f_res == FR_OK){printf(" write file sucess!!! file len = %d\n", fnum);printf(" write Data = %s\r\n", WriteBuffer);}else{printf(" write file error : %d\r\n", f_res);}f_close(&file);}else{printf(" open file error : %d\r\n", f_res);}//读取文件f_res = f_open(&file, "0:CUBE.txt", FA_OPEN_EXISTING | FA_READ);if(f_res == FR_OK){printf(" open file sucess!!! \r\n");f_res = f_read(&file, ReadBuffer, sizeof(ReadBuffer), &fnum);if(f_res == FR_OK){printf("read sucess!!! file len = %d\r\n", fnum);printf("read Data : %s\r\n", ReadBuffer);}else{printf(" read error!!! %d\r\n", f_res);}}else{printf(" open file error : %d\r\n", f_res);}f_close(&file);//关闭文件f_mount(NULL, "0:", 1);//取消挂载/* USER CODE END 2 */

编译下载后,可以看到串口端打印出所要的结果,中英文以及特殊字符都可以
ykun6
接下来再将SD卡取下,用读卡器接入电脑看看文件内容;
ykun7
ykun8
ykun9

工程链接

最后附上工程链接


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部