关于STM32单片机移植FATFS

发布者:HarmoniousPeace最新更新时间:2018-09-19 来源: eefocus关键字: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 
到这里基本就修改完了。 


关键字:STM32  移植fatfs 引用地址:关于STM32单片机移植FATFS

上一篇:让菜鸟秒变stm32高手的STM32CubeMX
下一篇:STM32之SPI_FLASH(实例)

推荐阅读最新更新时间:2024-03-16 16:14

关于stm32中R15寄存器的理解
今天上午看《stm32权威指南》中关于R15寄存器中有些内容不理解,查了查资料,原来是这样。 这里有一个别人的问题。 我把Nor Flash里的一个函数代码数据(函数首地址是:0x6400EC10)拷贝到RAM的 0x2000FC00, 然后把0x2000FC00加载给PC指针(为了让代码在RAM里运行),接着就出现了Hard Fault Exception,而用 IAR 单步执行的时候能正常运行。同时我将一个函数地址值赋给一个unsigned int 变量之后发现自动加了1。对于这些问题先看权威指南里是怎么说的吧。 一,PC指针(程序计数器R15)(权威指南) R15是程序计数器,在汇编代码中称为 PC指针
[单片机]
关于<font color='red'>stm32</font>中R15寄存器的理解
STM32之TFT触摸屏(ILI9320):通过LCD_ShowChar显示
使用TFT触摸屏时,想要对字符串,图形或者数字进行显示时,发现他们的库函数中都有一个最重要的函数LCD_ShowChar,貌似目前很少有人分析这个函数,虽然简单但是还是有点绕的。 先贴一下这个函数的代码,由于函数显示分为叠加显示和非叠加显示,原理类似,所以只分析非叠加方式的部分应该就都懂了。 void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) { u8 temp,t1,t; u16 y0=y; u16 colortemp=POINT_COLOR; num=num-' ';//得到偏移后的值 if(!mode) //非叠加方式
[单片机]
<font color='red'>STM32</font>之TFT触摸屏(ILI9320):通过LCD_ShowChar显示
STM32 I2C HAL库读取HTU21D
以下代码为使用I2C库函数读取HTU21D温度数据的例程。 ret=HAL_I2C_Mem_Read(&hi2c1,0x80,0xf3,I2C_MEMADD_SIZE_8BIT,rx_buf,2,2000); if(ret == HAL_OK) { rx_buf &= 0xfc; temp = rx_buf ; temp *= 256; //wendu =8; temp += rx_buf ; temp *= 17572; temp /= 65536; temp -= 4685; //保留两位小数 temp /=10; result = (int16_t)temp; pri
[单片机]
stm32读取电压HAL库版本
/* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ uint16_t adc_value = 0; double voltage = 0.0; char voltString = {0}; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /*
[单片机]
<font color='red'>stm32</font>读取电压HAL库版本
STM32+ESP8266+MQTT协议连接阿里云物联网平台
一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 硬件连接功能:ESP8266接在STM32的串口3上。通过AT指令与ESP8266进行通信。 注意:本篇文章没有贴ESP8266的底层编程代码,如果不会ESP8266底层编程,请看这里: https://blog.csdn.net/xiaolong1126626497/article/details/107379554 想了解STM32+ESP8266使用MQTT协议连接OneNET 中国移动服务器的看这里: https
[单片机]
STM32+ESP8266+MQTT协议连接阿里云物联网平台
stm32的TIM定时器HAL库函数的使用
相关具体内容参考 stm32f4xx_hal_time.h 几种模式函数的类型都差不多,包括基本类型(Base),输出比较(OC),输入捕获(IC),pwm(PWM),单脉冲(One_Pulse)和编码器(Encoder)。 /****** xxx使用上述几种模式的英文替换即可*******/ HAL_TIM_xxx_Init HAL_TIM_xxx_DeInit HAL_TIM_xxx_MspInit HAL_TIM_xxx_MspDeInit /***轮询方式启动/停止/ HAL_TIM_xxx_Start HAL_TIM_xxx_Stop /***中断方式启动/停止/ HAL_TIM_xxx_Start_IT HAL_TIM
[单片机]
STM32 基础系列教程 16 - I2S(模拟)
前言 学习stm32 I2S接口使用,学会用I2S接口收发数据,学习I2S总线相关知识, I2S(Inter—IC Sound)总线, 又称 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。 I2S总线接口有3个主要信号,但只能实现数据半双工传输,后来为实现全双工传输有些设备增加了扩展数据引脚。STM32f42x系列控制器支持扩展的I2S总线接口。 (1) SD(Seri
[单片机]
<font color='red'>STM32</font> 基础系列教程 16 - I2S(模拟)
意法半导体推出STM32互连型系列微控制器
  微控制器IC供应商意法半导体推出一全新系列的STM32微控制器,新产品以片上集成各种高性能工业标准接口为主打特色,且STM32不同型号产品在引脚和软件上具有完美的兼容性,这将让更多的应用从中受益。    全新STM32互连型(Connectivity)系列微控制器增加一个全速USB(OTG)接口,使终端产品在连接另一个USB设备时既可以充当USB主机又可充当USB从机;还增加一个硬件支持IEEE1588精确时间协议(PTP)的以太网接口,用硬件实现这个协议可降低CPU开销,提高实时应用和联网设备同步通信的响应速度。    全新互连型系列还是STM32家族中首款集成两个CAN2.0B控制器的产品,让开发人员能
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved