STM32移植fatfs(R0.10a版本)

2024-05-05 17:48
文章标签 stm32 移植 版本 fatfs r0.10

本文主要是介绍STM32移植fatfs(R0.10a版本),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于STM32单片机移植FATFS。
使用单片机的朋友都知道单片机一般提供的ROM和RAM都比较小。就算是STM32这样的提供256KB flash和64KB RAM的。一旦你需要存一些数据量比较大的文件的时候还是不够用的。一般可以通过外扩SD和nand flash来实现大容量存储。相对来说SD卡的使用更加方便一些。使用过nand flash的也许会知道nand flash有坏块,使用的时候需要做坏块管理,还有就是需要做损耗均衡。不然nand flash很容易就会坏掉。
下面说说SD卡。SD卡驱动有两种方式。一种是SPI驱动方式。还有一种是SDIO驱动方式。SPI驱动时只需要4更线:CLK、SD_CS、MISO、MOSI。SDIO则需要CLK、CMD、Data0、Data1、Data2、Data3。如果使用SDIO的话必须要硬件支持SDIO。类似51这样的单片机就不具备SDIO接口(STM32具有)。为了方便。这里使用SPI方式驱动SD卡。

这里写图片描述
首先需要去fatfs的网站下载fatfs源码。最好不要使用百度上下载的,因为百度上面的也许人家改过了,到时候出问题了都不知道是在哪里出错的。
http://www.elm-chan.org/fsw/ff/00index_e.html 可以在这里下载最新的源码。拿到源码后解压压缩包。或者使用http://pan.baidu.com/s/1gf3mdgv这里的压缩包,这个是我下载的未修改的源码。解压后的源码有两个文件夹如下图:
fatfs解压
进入src文件夹,问加减里面的文件如下图所示:
这里写图片描述
在移植fatfs之前需要做的工作是写好SD卡的最底层的驱动。这一部分这里不做详细介绍。默认为已经完成该部分工作。
然后建立工程。
首先使用一个已经完成SD卡最底层读写的工程。
SD卡读写工程
我这里使用的是原子的SD卡的底层读写。你也可以自己写。之所以用他的是因为用的人很多,后面大家来套我这个套路也比较容易找到代码。
然后在工程的基础上添加fatfs的相关文件(src文件夹下面的ff.c、diskio.c和option文件夹下面的cc936.c)添加好这两个文件到工程下面之后。就要对fatfs相关文件进行修改。主要修改的是diskio.c和ffcong.h这两个文件。还有就是修改STM32工程文件的path。要把src里面的文件的路径包含进去。
未修改之前diskio.c文件
在未修改之前的diskio.c文件里面的11、12/13行都是有一把红色的×的。那是因为没有这些头文件。直接把他们注释掉就好了。反正也不用。
改为下图模式
修改后的disckio.c文件
把ATA改为SD_Card。我们这里做SD的文件系统。不用管MMC和USB的。可以不用理他。然后diskio.c里面所有的ATA全部改为SD_Card。注释掉:
result = MMC_disk_initialize();
result = USB_disk_initialize();
result = MMC_disk_status();
result = USB_disk_status();
result = MMC_disk_read(buff, sector, count);
result = USB_disk_read(buff, sector, count);
result = MMC_disk_write(buff, sector, count);
result = USB_disk_write(buff, sector, count);
result = MMC_disk_ioctl(cmd, buff);
result = USB_disk_ioctl(cmd, buff);

找到
disk_initialize
修改SD卡的初始化改为:
disk_initialize
当然如果你的SD卡初始化、不是这个名字 请改为你自己SD卡初始化的名字。

修改disk_status函数:改为图中模样。
这里写图片描述
修改disk_read函数 如下图
disk_read函数
同理根据你自己SD的读扇区函数名。
修改disk_write函数
这里写图片描述
修改disk_ioctl函数
这里写图片描述
然后再文件的最后面加上
DWORD get_fattime (void)
{
return 0;
}
//动态分配内存
void ff_memalloc (UINT size)
{
return (void
)mymalloc(size);
}
//释放内存
void ff_memfree (void* mf)
{
myfree(mf);
}

修改ffconf.h文件:
1.将#define _USE_STRFUNC 0改为#define _USE_STRFUNC 1
2.#define _USE_MKFS 0改为#define _USE_MKFS 1
3.#define _USE_FASTSEEK 0改为#define _USE_FASTSEEK 1
4.#define _USE_LABEL 0改为#define _USE_LABEL 1
5.#define _CODE_PAGE 932改为#define _CODE_PAGE 936
6.#define _USE_LFN 0改为#define _USE_LFN 3
7.#define _VOLUMES 1改为#define _VOLUMES 2
到这里基本就修改完了。
这里附上STM32F103RCT6的SD卡fatfa的工程http://pan.baidu.com/s/1cAhWNs
更多软件/硬件/单片机交流请加群:740600942

(待续…)

这篇关于STM32移植fatfs(R0.10a版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962297

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

JeecgBoot 升级springboot版本到2.6.0

1. 环境描述 Jeecgboot 3.0,他所依赖的springboot版本为2.3.5Release,将springboot版本升级为2.6.0。过程全纪录,从2开始描述。 2. 修改springboot版本号 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare