本博文要求各位初步了解Fatfs文件系统

友情提示Fatfs官网:http://elm-chan.org/fsw/ff/00index_e.html

1.开发软件

  keil5,Cube5.21

2.实验目的

  往SDHC卡上移植Fatfs文件

SDHC:

  SDHC是"Secure Digital High Capacity“的缩写,即“高容量SD存储卡”。2006年5月SD协会发布了SD 2.0的系统规范,并在其中规定SDHC是符合该规范、SDHC存储卡容量为“4GB-32GB”。

  SDHC最大的特点就是高容量(4GB-32GB)。另外,SD协会规定SDHC必须采用FAT32 文件系统,这是因为之前在SD卡中使用的FAT16文件系统所支持的最大容量为2GB,并不能满足SDHC的要求。
  作为SD卡的继任者,SDHC主要特征在于文件格式从以前的FAT12、FAT16提升到了FAT32,而且最高支持32GB。同时传输速度被重新定义为Class2、Class4、Class6等级别,高速的SD卡可以支持高分辨视频录制的实时存储。
  SDHC卡的外形尺寸与SD卡一样,著作权保护机能等也和以前相同,但是由于文件系统被变更,以前只支持FAT12/16格式的SD设备存在不兼容现象,而支持FAT32(SDHC)的机器,仍可以读取现存的FAT12/16格式的SD卡。
FATFS:
  FatFs是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。
因为FatFs模块完全与磁盘I/O层分开,因此需要下面的函数来实现底层物理磁盘的读写与获取当前时间。底层磁盘I/O模块并不是FatFs的一部分,并且必须由用户提供。

3.Cube配置

(1)在Cube上点开芯片功能的SDIO,因为我用的是4GB的SDHC卡,所以用SD 4 bits,用默认配置即可与SD卡通信

红框内为SDIO协议引用的引脚

PC8 ------> SDIO_D0
PC9 ------> SDIO_D1
PC10 ------> SDIO_D2
PC11 ------> SDIO_D3
PC12 ------> SDIO_CK
PD2 ------> SDIO_CMD

(2)再点开下面的FATFS,即向工程里添加fatfs移植文件,然后再勾选SD Card,底层的disiko接口默认添加SD卡读写程序

(3)配置时钟完成后,就可生成工程

4.工程讲解

(1)下面的文件是Cube帮你移植的Fatfs文件,但不用修改里面的程序

(2)下面的两个C文件,一个是SD的diskio接口层,Cube已往里面调用了HAL库的SD卡读写函数,可以不修改,另一个是上层的fatfs文件功能函数,可根据需要添加函数,也可以不用修改。

(3)虽然Cube使用了MX_SDIO_SD_Init();进行了SD卡的初始化,但还要用下面的初始化进行初始化才能使用SD卡,它们在stm32f4xx_hal_sd.c里

  HAL_SD_Init(&hsd);
HAL_SD_InitCard(&hsd);

5.程序测试

(1)使用FATFS_GetAttachedDriversNbr()判断SD卡是否挂载上驱动

i=FATFS_GetAttachedDriversNbr();
printf("已挂载的驱动:%d",i);

(2)调用ff.c的文件功能函数,如果返回FR_OK(0)则成功

/* USER CODE BEGIN Application */
void SD_Fatfs_Test(void)
{
printf("文件挂载\n" );
retSD=f_mount(&SDFatFS, "0:/",);
if(retSD==FR_OK)
{
printf("MOUNT OK\n");
printf("FAILED0: %d\n",retSD);
}
else
printf("FAILED2: %d\n",retSD);
printf("文件打开\n" );
retSD=f_open(&SDFile, "0:hellow.txt", FA_CREATE_ALWAYS | FA_WRITE | FA_READ );
if(retSD==FR_OK)
{
printf("OPEN OK\n");
}
else
printf("FAILED3: %d\n",retSD); printf("文件关闭\n" );
retSD=f_close(&SDFile); if(retSD==FR_OK)
{
printf("closk OK\n");
}
else
printf("FAILED5: %d\n",retSD); }

(3)HAL_SD_ReadBlocks()和HAL_SD_WriteBlocks()可以往SD卡读写数据

(4)用以下的HAKL库函数可读取SD卡的信息,有兴趣可以去弄

HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd);
HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID);
HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD);
HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus);
HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo);

6.Fatfs使用小经验

(1)使用FATFS,FIL等类型的变量时,可能要先申请内存空间,才能使用。具体是怎样请先学习STM32的内存管理。

(2)使用f_mount,f_close等文件功能函数出错时,请看其返回函数为何值,更容易调试。


typedef enum {
FR_OK = , /* (0) Succeeded */
FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
FR_INT_ERR, /* (2) Assertion failed */
FR_NOT_READY, /* (3) The physical drive cannot work */
FR_NO_FILE, /* (4) Could not find the file */
FR_NO_PATH, /* (5) Could not find the path */
FR_INVALID_NAME, /* (6) The path name format is invalid */
FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
FR_EXIST, /* (8) Access denied due to prohibited access */
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
FR_NOT_ENABLED, /* (12) The volume has no work area */
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
} FRESULT;

(3)要先加载文件卷,才能用文件功能函数。

(4)程序出错一般是底层接口函数没写好。

粗糙之作,有不合之处请多多指教。

基于STM32F429,Cubemx的SDHC卡的基本Fatfs文件移植的更多相关文章

  1. 基于STM32F429,Cubemx的SAI音频播放实验

    书接上文:https://www.cnblogs.com/feiniaoliangtiangao/p/11060674.html 和 https://www.cnblogs.com/feiniaoli ...

  2. 基于Python的信用评分卡模型分析(二)

    上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理.探索性数据分析.变量分箱和变量选择等.接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分 ...

  3. 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形

    主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...

  4. Qt SD卡 文件系统挂载、文件预览

    /********************************************************************************** * Qt SD卡 文件系统挂载. ...

  5. 如何为基于windows验证的站点的某个页面、文件或文件夹单独设置匿名访问

    在MOSS的项目中,我们经常碰到要单独为基于windows验证的站点的某个页面.文件或文件夹单独设置匿名访问即不登录就可以直接访问.比如说站点的A的某些图片或文件URL存在B站点下的文件夹下.此时访问 ...

  6. 获取SD卡中的音乐文件

    小编近期在搞一个音乐播放器App.练练手: 首先遇到一个问题.怎么获取本地的音乐文件? /** * 获取SD卡中的音乐文件 * * @param context * @return */ public ...

  7. 基于Python的信用评分卡模型分析(一)

    信用风险计量体系包括主体评级模型和债项评级两部分.主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡.B卡.C卡和F卡:债项评级模型通常按照主体的融资用途,分为 ...

  8. 基于STM32F429的内存管理

    1.内存管理介绍 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 内存管理的实现方法有很多种,他们其实最终都是要 ...

  9. 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序

    硬件设备   42步进电机,步进电机驱动器,正点原子F429开发板 开发软件    keil5,Cube 综述   一般要精准的控制电机,就要控制单片机的引脚输出指定个数的PWM波,有多种可实现的方法 ...

随机推荐

  1. ASP.NET Core开发者指南()

    你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“作为 ASP.NET Core 开发者,我接下来应该学习什么?”,我把这张图作为建议 ...

  2. Sql中将datetime转换成字符串的方法(CONVERT())

    语法格式:CONVERT (<data_ type>[ length ], <expression> [, style]) style的含义:style 是将DATATIME ...

  3. jquery查出元素名称

    <div onclick='$(this).prop("tagName")'></div> 最后的结果 DIV

  4. oopday01(面向对象-类&private&this)

    面向对象基本概述.封装 01_面向对象(面向对象思想概述) * A:面向过程思想概述    * 第一步    * 第二步 * B:面向对象思想概述    * 找对象(第一步,第二步) * C:举例   ...

  5. 使用Navicat Keygen激活(破解)Navicat Premium 12

    1.到Navicat官网下载使用版本进行安装,具体操作不再详述.Navcat官网下载链接:http://www.navicat.com.cn/download/navicat-premium : 2. ...

  6. react-组件间的传值

    父组件向子组件传值 父组件通过属性进行传递,子组件通过props获取 //父组件 class CommentList extends Component{ render(){ return( < ...

  7. Java方法之重载

    Java方法之重载 本篇探究Java中的方法重载.那么,什么是重载呢?先上一串代码: package com.my.pac06; /** * @author Summerday * @date 201 ...

  8. Mysql字符串截取_获取指定字符串中的数据

    前言:本人遇到一个需求,需要在MySql的字段中截取一段字符串中的特定字符,类似于正则表达式的截取,苦于没有合适的方法,百度之后终于找到一个合适的方法:substring_index('www.sql ...

  9. MongoDB(二):在Windows环境安装MongoDB

    1. 在Windows环境安装 1.1 MongoDB下载 要在Windows上安装MongoDB,首先打开MongoDB官网:https://www.mongodb.com/download-cen ...

  10. 番茄助手 最新 Visual Assist X 适应于VS2019 VS2017 VS2015 VS2013 亲测可用

    番茄助手 最新 Visual Assist X 适应于VS2019 VS2017 VS2015 VS2013 亲测可用 如图: 颜色已经改变: 下载说明: /* INSTALLATION 0) Uni ...