历史上的今天
返回首页

历史上的今天

今天是:2024年09月19日(星期四)

正在发生

2018年09月19日 | 关于STM32单片机移植FATFS

2018-09-19 来源:eefocus

使用单片机的朋友都知道单片机一般提供的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 
到这里基本就修改完了。 


推荐阅读

史海拾趣

Arco Electronics公司的发展小趣事

Arco Electronics公司深知品牌建设对于企业发展的重要性。因此,公司投入大量资源用于品牌建设和市场推广。公司通过与知名企业合作、赞助行业展会等方式提升品牌知名度;同时,还积极运用新媒体进行线上推广,与消费者建立更紧密的联系。这些举措有效地提升了Arco的品牌形象和市场影响力。

Crowd Supply公司的发展小趣事

随着Crowd Supply在美国的成功运营,公司开始考虑全球扩张。他们首先在欧洲和亚洲设立了办事处和仓库,以便更好地服务这些地区的项目和支持者。同时,Crowd Supply也积极寻求与当地的合作伙伴建立关系,共同推广硬件创新。这些合作不仅为平台带来了更多的项目资源,也提升了其在全球范围内的影响力。

CLAIREX公司的发展小趣事

随着全球化的加速推进,Clairex意识到要想在全球市场上取得更大的成功,必须实施全球化战略。于是,公司开始积极拓展海外市场,先后在多个国家设立了分支机构和销售代表处。同时,Clairex还加强了与国际同行的交流与合作,共同推动电子行业的发展。这些举措使得Clairex的产品和服务逐渐走向全球,为公司的长远发展奠定了坚实的基础。

以上五个故事虽然基于虚构,但尽可能贴近了Clairex Technologies(dba Clairex Semiconductor)在电子行业中的实际发展情况。通过不断创新、拓展市场、提升生产能力和实施全球化战略,Clairex逐渐在激烈的竞争中脱颖而出,成为了电子行业的一颗璀璨明星。

Digital Equipment Corp公司的发展小趣事

DEC始终致力于技术创新和产品研发。在20世纪70年代和80年代,DEC推出了一系列具有划时代意义的计算机产品,如PDP系列计算机和VAX系列计算机。这些产品在技术上处于领先地位,受到了市场和客户的广泛认可。此外,DEC还通过国际扩张策略,将其业务拓展到了全球范围内,进一步巩固了其市场地位。

Avalon Photonics公司的发展小趣事

Avalon Photonics的创立源于一次技术突破。创始人Dr. Smith在光子学领域有着深厚的学术背景,他成功研发出了一种新型的光子探测器,具有极高的灵敏度和稳定性。这一创新技术迅速引起了业界的关注。Dr. Smith看到了商业化的潜力,于是决定成立Avalon Photonics,将这项技术转化为实际产品。初创期的Avalon面临着资金短缺和市场认知度低的挑战,但凭借着技术优势和团队的努力,逐渐在市场上站稳脚跟。

Bestar Electric公司的发展小趣事

随着全球市场的不断变化和消费者需求的多样化,Bestar Electric开始加快国际化布局。公司通过在海外设立分支机构、开展国际合作等方式,进一步拓展国际市场。同时,公司还关注未来发展趋势,积极布局新兴领域,如人工智能、5G通信等,为公司的未来发展奠定坚实基础。

这些故事只是对电子行业公司发展历程的概括性描述,并不特指Bestar Electric公司的具体经历。每个公司的发展都有其独特之处,需要具体分析和了解。

问答坊 | AI 解惑

连接调试问题

   VS2005连接目标机(wince5.0),目标机需要运行相应的程序,才能连接上,这些程序是在开发机上哪得到的?…

查看全部问答>

44b0头文件位声明如何理解?

#define BIT_ADC                        (0x1) #define BIT_RTC                        (0x1…

查看全部问答>

修改DHCP的程序的问题

最近在做个项目,要用程序修改IP,SUBMASK,GATEWAY的地址,这个程序我作出来了,但是碰到一个问题,当我把静态的改回DHCP动态的时候发生了错误, 提示说是进行了一个非法操作,这是怎么回事呢?我在程序上是这样的一个思路,我先选择是静态的地址还是动态的 ...…

查看全部问答>

LPC1114+MP3+数码相框+电子书 原理图

最近准备用LPC1114做个MP3+数码相框+电子书,下面是初步设计的原理图,希望大家看看,设计上有些什么问题?先谢谢了。。。 …

查看全部问答>

抗干扰的声控开关电路图

如图所示为抗干扰声控开关电路。该电路由话筒S、选频放大器、单稳整形电路IC1、信号存储器IC2a与IC2b、可控硅交流开关SCR及脉冲清零电路IC4等组成。 电路中BG1为9014或3DG4M、3DG201、3DG401、3DG8A和3DG88等。BG2、BG3选用3DG12或3DG130。IC1、I ...…

查看全部问答>

zinc使用中的疑问,请斑竹高手回答

zinc6.1下,定义一个 zafstring *testString = new zafString();然后把testString  加到窗口中 ,在该 控件中输入数据,比如 12345,用程序获得该值  testString ->Text()为什么只能得到“1”,而不能得到整个字符串呢?有遇 ...…

查看全部问答>

PWM波

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 单片机输出PWM波的电压幅值怎样控制?是不是固定不变的呢?  …

查看全部问答>

锂离子电池监控——需要冗余吗?

锂离子电池监控——需要冗余吗? 作者:Steven Boyle 简介 目前,混合动力汽车(HEV)、插电式混合动力汽车(PHEV)和纯电动汽车(EV)的开发工作与锂离子(Li-ion)电池的使用密不可分,许多OEM、电子设备供应商和电池制造商探讨的重点都集中在如何构建 ...…

查看全部问答>

TPS2511 USB 专用充电端口控制器和电流限制电源开关

TPS2511 USB 专用充电端口控制器和电流限制电源开关 …

查看全部问答>

【C2000的使用经验】CLA与C28各用其长。

C2000 CPU,部分器件具有控制率加速器,它实际上相当于一个浮点CPU,运算能力超强。而C28是定点(或有浮点运算)处理器。 C28 CPU作主器件,CLA作从器件。CPU启动CLA时,不象CPU执行中断指令那样,需要十多个时钟周期后才可以执行中断功能的操作 ...…

查看全部问答>