STM32入门学习笔记之文件系统FatFs的移植3

发布者:心愿达成最新更新时间:2024-05-10 来源: elecfans关键字:STM32  文件系统  FatFs  移植 手机看文章 扫描二维码
随时随地手机看文章

21.2.2 ffsystem.c文件的修改

(1)内存分配ff_memalloc


void* ff_memalloc( UINT msize )



{


return ( void* )mymalloc( SRAMIN, msize ) ;

}


(2)内存释放ff_memfree


void ff_memfree( void* mblock )


{


myfree( SRAMIN, mblock ) ;

}


21.2.3 exfuns.c与exfuns.h文件的创建

(1)创建exfuns.h文件,并输入以下代码


#ifndef _EXFUNS_H


#define _EXFUNS_H


#include 'sys.h'


#include 'ff.h'


extern FATFS *fs[ FF_VOLUMES ] ;


extern FIL *file;


extern FIL *ftemp;


extern UINT br,bw;


extern FILINFO fileinfo;


extern DIR dir;


u8 exfuns_init( void ) ; //为exfuns申请内存


u8 exf_getfree( u8 *drv, u32 *total, u32 *free ) ; //得到磁盘总容量和剩余容量


#endif


(2)创建exfuns.c文件,并输入以下代码。


#include 'exfuns.h'


#include 'malloc.h'


FATFS *fs[ FF_VOLUMES ] ; //逻辑磁盘工作区


FIL *file ; //文件1


FIL *ftemp ; //文件2


UINT br, bw ; //读写变量


FILINFO fileinfo ; //文件信息


DIR dir ; //目录


u8 *fatbuf ; //SD卡数据缓存区


u8 exfuns_init()


{


u8 i;


   for( i=0; i


   {


            //为磁盘i工作区申请内存


          fs[ i ] = ( FATFS* )mymalloc( SRAMIN, sizeof( FATFS ) ) ;


          if( !fs[ i ] )


                 break ;


   }


   file = ( FIL* )mymalloc( SRAMIN, sizeof( FIL ) ) ;       //为file申请内存


   ftemp = ( FIL* )mymalloc( SRAMIN, sizeof( FIL ) ) ;   //为ftemp申请内存


   fatbuf = ( u8* )mymalloc( SRAMIN, 512 ) ;               //为fatbuf申请内存


   //申请有一个失败,即失败


   if( ( i==FF_VOLUMES )&&file&&ftemp&&fatbuf )


          return 0 ;


   else


          return 1 ;

}


u8 exf_getfree( u8 *drv, u32 *total, u32 *free )


{


FATFS *fs1;


   u8 res;


   u32 fre_clust=0, fre_sect=0, tot_sect=0;


   //得到磁盘信息及空闲簇数量


   res = ( u32 )f_getfree( ( const TCHAR* )drv, ( DWORD* )&fre_clust, &fs1 ) ;


   if( res==0 )


   {                                                                              


          tot_sect =( fs1->n_fatent-2 )*fs1->csize ;          //得到总扇区


          fre_sect = fre_clust*fs1->csize ;                         //得到空闲扇区数


          //扇区大小不是512字节,则转换为512字节


          #if FF_MAX_SS!=512


                 tot_sect*=fs1->ssize/512;


                 fre_sect*=fs1->ssize/512;


          #endif


          *total=tot_sect>>1 ;                                                                    //单位为KB


          *free=fre_sect>>1 ;                                            //单位为KB

}


return res;

}


注:如果SD卡文件系统不能正确挂载则需要修改SD卡驱动文件中的两个参数,如下图所示。


6f1e7396787fb20cd2e607c7e0374379_pYYBAGPY5VeAItfiAAKLEwPpV68346.jpg?imageView2/2/w/1000


21.3 内存管理

21.3.1 内存管理简介

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。内存管理的实现方法有很多种,他们其实最终都是要实现2个函数:malloc和free;malloc函数用于内存申请,free函数用于内存释放。


这一部分我们使用了一种比较简单的办法来实现:分块式内存管理。下面我们介绍一下该方法的实现原理,如下图所示。

48fb5248f788cf3c860c22cd985653c0_poYBAGPY5VeAO2ZUAABiZgt08BU708.jpg?imageView2/2/w/1000

从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。内存管理表的项值代表的意义为:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为10,那么说明包括本项对应的内存块在内,总共分配了10个内存块给外部的某个指针。


内存分配方向如图所示,是从顶到底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。


21.3.2 分配原理

当指针p调用malloc申请内存的时候,先判断p要分配的内存块数m,然后从第n项开始,向下查找,直到找到m块连续的空内存块(即对应内存管理表项为0),然后将这m个内存管理表项的值都设置为m(标记被占用),最后,把最后的这个空内存块的地址返回指针p,完成一次分配。注意,如果当内存不够的时候(找到最后也没找到连续的m块空闲内存),则返回NULL给p,表示分配失败。


21.3.3 释放原理

当p申请的内存用完,需要释放的时候,调用free函数实现。free函数先判断p指向的内存地址所对应的内存块,然后找到对应的内存管理表项目,得到p所占用的内存块数目m(内存管理表项目的值就是所分配内存块的数目),将这m个内存管理表项目的值都清零,标记释放,完成一次内存释放。


21.3.4 源代码实现

(1)创建malloc.h文件,并输入以下代码。


/*********************************************************************************************************

                内    存    管    理    文    件

*********************************************************************************************************/

#ifndef _MALLOC_H_

#define _MALLOC_H_



#include 'sys.h'

/*********************************************************************************************************

                数    据    结    构    定    义

*********************************************************************************************************/

//定义两个内存池

#define SRAMIN   0    //内部内存池

#define SRAMBANK   1  //定义支持的SRAM块数

//mem1内存参数设定

#define MEM1_BLOCK_SIZE      32                                    //内存块大小为32字节

#define MEM1_MAX_SIZE      40*1024                                  //最大管理内存40K

#define MEM1_ALLOC_TABLE_SIZE  MEM1_MAX_SIZE/MEM1_BLOCK_SIZE                      //内存表大小

//内存管理控制器

struct _m_mallco_dev

{

  void ( *init )( u8 ) ;              //初始化

  u8 ( *perused )( u8 ) ;              //内存使用率

  u8   *membase[ SRAMBANK ] ;            //内存池 管理SRAMBANK个区域的内存

  u16 *memmap[ SRAMBANK ] ;            //内存管理状态表

  u8  memrdy[ SRAMBANK ] ;            //内存管理是否就绪

};

extern struct _m_mallco_dev mallco_dev;                                  //在mallco.c里面定义

/*********************************************************************************************************

                  函    数    列    表

*********************************************************************************************************/

void my_mem_init( u8 memx ) ;                                      //内存管理初始化函数

u8 my_mem_perused( u8 memx ) ;                                      //获得内存使用率

void myfree( u8 memx, void *ptr ) ;                                    //内存释放

void *mymalloc( u8 memx, u32 size ) ;                                  //内存分配

void *myrealloc( u8 memx, void *ptr, u32 size ) ;                            //重新分配内存



#endif


关键字:STM32  文件系统  FatFs  移植 引用地址:STM32入门学习笔记之文件系统FatFs的移植3

上一篇:STM32入门学习笔记之USB读卡器实验2
下一篇:STM32入门学习笔记之CAN通信实验2

推荐阅读最新更新时间:2026-03-25 11:12

STM32移植FATFS,读取SD卡上FAT12/16/32文件系统
给stm32移植fatfs文件系统,今天终于取得阶段性胜利。只需要提供这样几个函数即可 DSTATUS disk_initialize (BYTE); DSTATUS disk_status (BYTE); DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); // 如果实现只读的文件系统就不需要了。 DRESULT disk_ioctl (BYTE, BYTE, void*); 移植成功后,可以用如下方式读取SD卡了,实在太方便了,和PC机上编程差不了多少。 unsigned in
[单片机]
基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)
四、移植FATFS文件系统 前面第3章,完成了SD NAND的驱动代码编写,这一章节实现FATFS文件的移植。 4.1 FATFS文件系统介绍 (1)介绍 FatFs 是一种完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C 语言编写,所以具有良好的硬件平台独立性,可以移植到 8051、 PIC、 AVR、 SH、 Z80、 H8、 ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、 FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。 (2)特点 【1】Windows兼容的FAT文件系统 【2
[单片机]
基于STM32+CS创世 SD NAND(贴片SD卡)完成<font color='red'>FATFS</font><font color='red'>文件系统</font><font color='red'>移植</font>与测试(下篇)
LPC1768 SPI模式下SD卡FatFs文件系统移植
最近在LPC1768 SPI模式下移植SD卡FatFs(版本R0.09a)文件系统成功,总结一下移植过程。 一、底层驱动 使用的SSP0的SPI模式驱动,SSP时钟开始使用的25M。SD卡驱动测试完成,可读写擦除测试没有问题之后开始文件系统移植。 要用到的底层驱动函数有: MMCSD_TYPE MMCSD_Init(void) BOOL MMCSD_EraseBlocks(uint32_tblkStart,uint32_t blkEnd) BOOL MMCSD_ReadSingleBlock(uint32_tblkIndex,uint8_t *pBytes) uint32_t MMCSD_ReadMul
[单片机]
基于stm32cubemx对fatfs文件系统进行移植
今天要给大家分享的是使用FatFs这个库来读写SD卡上面的文件。工程的初始化函数和FatFs都是通过STM32CubeMX配置生成的,不需要我们手动添加库。 今天分享的内容和我的上一篇帖子 SDIO读取SD卡的扇区 有关,最好掌握了SDIO读取SD卡扇区的基础之后再来看这一篇帖子。 写在前面的话 上一次发表了关于SDIO读取SD卡的一篇开发分享的帖子,今天呢就更进一步使用了FatFs文件系统。同样我们完全使用ST公司提供的STM32CubeMX软件和HAL库来进行开发。如果喜欢我的帖子请多多回复我会努力更新的。 我使用的工具 开发平台:正点原子探索者STM32F407开发板 硬件:使用了NUCLEO-F446RE开发板的ST-Li
[单片机]
STM32——SD卡和FATFS文件系统
最近看了32的sd卡和FATFS文件系统,现在就自己的理解总结一下。 一、SD卡模块 SD 卡:安全数码卡, 它是在 MMC 的基础上发展而来, 是一种基于半导体快闪记忆器的新一代记忆设备。按容量分类,可以将SD 卡分为 3 类: SD 卡、 SDHC 卡、 SDXC 卡。SD卡(SDSC):0~2G SDHC卡:2~32G SDXC卡:32G~2T。 SD 卡一般支持 2 种操作模式: SD 卡模式(通过 SDIO 通信):允许 4 线的高速数据传输,只能使用 3.3V 的 IO 电平,所以, MCU 一定要能够支持 3.3V 的 IO 端口输出。 SPI 模式:同 SD 卡模式相比就是丧失了速度,在 SPI 模式
[单片机]
<font color='red'>STM32</font>——SD卡和<font color='red'>FATFS</font><font color='red'>文件系统</font>
stm32——Fatfs文件系统读写文件
因项目需求需要移植fatfs文件系统,参考了正点原子的战舰例程。 使用mcu为stm32f103zet6,spi的sd卡模块,8Gsd卡。例程为mini板(mcu:stm32f103rct6)的 ALIENTEK MINISTM32 实验29 FATFS文件系统实验,zet6的例程由于是sdio模式所以没有选用。 初始化 这里只初始化sd卡.e2prom部分删除了 mem_init(); //初始化内存池 //SD卡检测及初始化 while(SD_Initialize()) //检测不到SD卡 { delay_ms(500); } e
[单片机]
<font color='red'>stm32</font>——<font color='red'>Fatfs</font><font color='red'>文件系统</font>读写文件
STM32FATFS文件系统常用API函数的理解
首先,第一次在CSDN上面开通博客,这也算是我的第一篇博文吧,写的不好的地方还请大家不吝赐教 ,笔者现大二在校学生,之所以会选择在这里使用博客,是在一位嵌入式大虾的渲染下,和小伙伴一起分享学习的话,我相信可以学的更多。 废话不多说,进入主题。 首先,FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计的,使用标准的C语言编写,具有很强的独立性,可以轻松的移植到8位,16位,及其我正在用的32位ARM系列的STM32上面。即FATFS是可裁剪的文件系统。这点,尤为重要。 FATFS模块的层次结构图如下,这里,参考了部分正点原子的资料,感谢原子大大 其中底层接口,包括存储媒介读/写接口(dis
[单片机]
对<font color='red'>STM32</font>中<font color='red'>FATFS</font><font color='red'>文件系统</font>常用API函数的理解
使用Cubemx移植FatFsstm32
在大型的存储器中,没有文件系统是万万不可行的,你不可能每次要打开一个文件都要从头到尾扫描一遍存储器,几兆的小存储器还好,几G甚至几T的存储器就根本没办法这么做了。而且有了文件系统也可以方便的管理使用各类文件。 这一次使用Cubemx生成FatFs的初始化代码,然后做最后的移植工作。本人使用的是stm32f767的野火的板子。 介绍一下FafFs 系统架构 FatFs是一种中间层,可以屏蔽硬件的差异,移植起来非常方便 移植需要注意的地方 你需要提供FatFs需要的底层I/O函数,需要的函数如下表,但是并不是全部函数都需要,你只需要提供必需的disk_status disk_initialize disk_read 和你需要的
[单片机]
使用Cubemx<font color='red'>移植</font><font color='red'>FatFs</font>到<font color='red'>stm32</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved