本博文要求各位初步了解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. poj 1511 Invitation Cards (最短路)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 33435   Accepted: 111 ...

  2. 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  3. 《Java练习题》进阶练习题(五)

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题. [程序88 ...

  4. 《Java基础知识》Java内部类及其实例化

    在 Java 中,允许在一个类(或方法.语句块)的内部定义另一个类,称为内部类(Inner Class),有时也称为嵌套类(Nested Class). 内部类和外层封装它的类之间存在逻辑上的所属关系 ...

  5. Ubuntu16.04+GTX2070+Driver418.43+CUDA10.1+cuDNN7.6

    最近需要用到一台服务器的GPU跑实验,其间 COLMAP 编译过程出错,提示 cuda 版本不支持,cmake虽然通过了,但其实没有找到支持的CUDA架构. cv@cv:~/mvs_project/c ...

  6. 【1封新邀请】想跟谷歌、七牛、kyligence等大佬面对面的交流吗?

    2020年1月4日-5日,"ECUG Con 2020"大会将于杭州举行.本次大会以"ECUG For Future"为主题,围绕五大技术主题,邀请到来自七牛云 ...

  7. Python面向对象-枚举类型enum

    枚举类型:在实际问题中,有些变量的值被限定在一个有限的范围内.例如:一个星期有且只有7天,一年有且只有十二个月,一个班每周有6门课程等等.如果把这些量说明为整型.字符串或者其他类型显然是不合适.编程界 ...

  8. 安卓AlertDialog四种对话框的最科学编写用法

    首先我们上图: xml的代码如下,用于编写按钮: <?xml version="1.0" encoding="utf-8"?> <Linear ...

  9. Android 日期对话框 DatePickerDialog

    private int year; private int monthOfYear; private int dayOfMonth; @Override protected void onCreate ...

  10. MySQL数据库Group by分组之后再统计数目Count(*)与不分组直接统计数目的区别

    简述问题“统计最新时刻处于某一状态的设备的数量” 1. 首先子查询结果,可以看到每个设备最新的状态信息 2.1 在子查询的基础上,对设备状态进行分组,进行统计每个状态的设备数量 2.1.1 可以看到处 ...