本博文要求各位初步了解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. CodeForces - 556D Case of Fugitive (贪心+排序)

    Andrewid the Android is a galaxy-famous detective. He is now chasing a criminal hiding on the planet ...

  2. hdu 4725 The Shortest Path in Nya Graph (最短路+建图)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. 利用PyCharm操作Github(二):分支新建、切换、合并、删除

      在文章利用PyCharm操作Github:仓库新建.更新,代码回滚中,我们已经学习到了如何利用PyCharm来操作Github,其中包括了一些常见的Github操作:仓库的新建.更新以及代码回滚. ...

  4. Python操作MySQL的一些坑

    pip安装库时遇到的问题   我使用ubuntu系统通过pip安装MySQLdb库的时候,报了一堆错,解决了半天,没搞定.然后安装另一个库pymysql一下就OK了,它们的功能都是一样的.这个问题我没 ...

  5. com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

    1.错误显示 com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details log提示:Generate Si ...

  6. 微信小程序—支付宝身份验证(支付宝小程序)

    查看应用:https://open.alipay.com/platform/keyManage.htm  这里找到您调用接口的应用 支付宝身份验证快速接入:https://docs.open.alip ...

  7. javascript学习总结之函数

    前言 在学习javascript函数的时候,有几个经常很容易混淆的方法,call,apply,bind,caller,callee,这些方法的使用,这些也可以说是会频繁使用的一些方法,在此通过查阅相关 ...

  8. openwrt_在PPPOE上网的同时_访问光猫

    openwrt_在PPPOE上网的同时_访问光猫 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-14. 参考文章: 光猫桥接模式下,通过路由器访问光猫.简单设置 设置Open ...

  9. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  10. mysql5.5下载安装教程

    下载地址:https://dev.mysql.com/downloads/mysql/ 这里选择的是5.5的版本: 步骤1: 步骤2: 步骤三: 步骤四: 步骤5: 步骤6: 步骤7: 步骤8: 步骤 ...