历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2018年09月16日 | 基于STM32F407的FatFs文件系统在SD卡驱动上的移植

2018-09-16 来源:eefocus

         最近在做SD卡驱动,以前移植过efsl,觉得用的人不是很多,现在移植个FatFs,也跟上队伍。

         第一步,保证SD卡底层驱动函数正确,包括SD卡初始化、SD扇区读写等。

         第二步,下载FatFs源码,名为ff9b.zip,解压在src文件夹中可以得到diskio.c、ff.c、以及\option\cc936.c这三个源码文件,在STM32F407工程文件中创建FatFs文件夹,加入这几个源码以及相应头文件,并且在系统Include Path中加入这个文件夹的位置,以编译时找到其头文件。

         第三步开始移植。diskio.c这个文件中定义了fatfs文件系统与硬件存储器之间的接口函数,供文件系统调用,包括disk_initialize、disk_status、disk_read、disk_write、disk_ioctl五个函数。ff.c中存放了FatFs文件操作的常用函数,包括文件以及文件夹的操作。cc936.c是简体汉字编码文件。

         首先在ffconf.h中配置文件系统。将#define_CODE_PAGE         932 改为936以支持简体中文,原来默认支持日文,不知道为啥,莫非这个东东是日本人写的?先不研究。编译一下,发现如下错误:

         #if !_USE_LFN || _CODE_PAGE != 936

         #error This file is not needed incurrent configuration. Remove from the project.

         #endif

         其中宏定义_USE_LFN表明是否使用长文件名,修改为1,使用静态区BSS存储,最长文件名为255个字符。重新编译,发现有很多没有定义的函数,包括例如ATA_disk_initialize、ATA_disk_status、ATA_disk_read、ATA_disk_write等,由于我们使用的介质是SD卡,删掉其他ATA、USB以及MMC相关的函数,只留下SD_disk_initialize、SD_disk_status、SD_disk_read、SD_disk_write、SD_disk_ioctl以及get_fattime这几个函数。

         下面就逐步实现这几个函数。

         disk_initialize,对应底层函数为SD_Init。

         disk_status中简单让其返回0,表示成功。

         disk_read可看出输入有四个参数值,分别为设备类型pdrv、数据缓存区指针buff、扇区地址sector以及扇区个数count。这可以看出disk_read一次可以读取多个扇区,在函数体内添加

        for(cnt=0; cnt

            res =SD_ReadSingleBlock(sector+cnt, buff+cnt*512);

            if(res != RES_OK) return RES_ERROR;

        }

类似的,在disk_write也如此处理。最后将disk_ioctl中直接返回状态RES_OK。改其他小错误后编译通过。

         下面开始测试,在SD卡中编写一个创建文件测试用例:

         创建文件系统以及文件对象:

         FATFS fs;

         FIL file;

         ①result = f_mount(FS_SD, &fs);挂载文件系统,说明在系统中存在了FS_SD这个设备以及文件系统

         ②result = f_opendir(&DirInf, "/");打开根目录,在这个函数中又调用了chk_mounted,对SD卡进行了初始化

         ③result = f_open(&file, "helloYou.txt",FA_CREATE_ALWAYS | FA_WRITE);在根目录下创建一个文本文件

         ④result = f_write(&file,text,strlen(text), &bw); 写入测试文档,为了可以测试写入多个块儿是不是正确,直接找了一大段天龙八部写了进去,可以在SD卡中看到正确的文档,哈哈,测试成功。


推荐阅读

史海拾趣

Altonics公司的发展小趣事

随着技术的不断进步,Altonics公司始终保持着对创新的热情。公司加大研发投入,引进高端技术人才,不断推出具有创新性和竞争力的新产品。其中,公司自主研发的一款智能传感器,凭借其高精度、高稳定性的特点,迅速占领市场份额,成为工业自动化领域的明星产品。

华润微(CRMICRO)公司的发展小趣事

2001年,华润微成立矽科公司,开始涉足芯片设计业务。这一举措使公司能够为客户提供更加完整的解决方案,并进一步提升其市场竞争力。同时,华润微也意识到封装测试在半导体产业链中的重要性,于是在2003年成立安盛公司,开始进入封装测试领域。通过建立6英寸产线,华润微进一步巩固了其在半导体产业链中的地位。

CIF公司的发展小趣事

D公司始终坚持品质至上的经营理念,以提供高品质的电子产品为己任。在CIF交易模式下,D公司严格控制产品质量,从原材料采购到生产流程中的每一个环节都进行严格把关。凭借出色的产品质量和良好的售后服务,D公司赢得了客户的信任和好评。

Andon Electronics公司的发展小趣事

C公司是一家专注于电子产品贸易的CIF公司。为了降低成本、提高效率,C公司积极整合全球供应链资源,与多家优质的电子产品生产商建立了长期合作关系。通过优化采购、生产和物流等环节,C公司成功降低了运营成本,提高了市场竞争力。

C.K Magma公司的发展小趣事

随着技术的成熟,C.K Magma公司开始将产品推向市场。他们积极与各大电子厂商合作,为其提供高性能的半导体解决方案。同时,公司还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。随着市场份额的逐步扩大,C.K Magma公司逐渐在电子行业中树立起了自己的地位。

Ericsson公司的发展小趣事

随着通信技术的不断发展和市场竞争的加剧,Ericsson也面临着前所未有的挑战。为了应对这些挑战,Ericsson积极进行转型升级。一方面,公司加大了对研发的投入力度,不断推出具有创新性和竞争力的产品和服务;另一方面,Ericsson也通过收购、兼并等方式拓展业务领域和市场份额。此外,公司还注重与合作伙伴建立紧密的合作关系共同推动行业发展。

问答坊 | AI 解惑

AT201无线防盗报警器

该系统是当今先进的防盗报警系统,以求助、防盗融为一体,是现代家庭理想的保安器材。最适用于家庭、商铺的防盗报警。        探头发现盗情后,主机自动拨打您预存的电话号码(多至10个),如手机、固定电 ...…

查看全部问答>

C语言返回语句

如流程图所示,在程序中要写返回到开始程序的语句,但是我不会用C语言写,请求帮助! 另外,那个定时功能用C语言该怎么写啊? 谁有类似的程序啊?…

查看全部问答>

请问谁用过wince的kernel profiler,能给我些资料吗?

我发现除了msdn外,几乎没什么资料,谁有些资料能共享下啊? 或者msdn上的好文章给我点连接也行。…

查看全部问答>

EVC里面有否办法调整窗口的z次序分配规则

   WinCE里面做Win32应用程序,十分郁闷的就是其控件Z次序分配与VS里面完全相反,VS里面后创建的控件在前,但是在CE里面却是先创建的控件在前,造成很多不便,比如说要声明一个Group Button,再以这个Group Button作为父窗口在里面再创建 ...…

查看全部问答>

朋友们进来接分喽

我在深圳搞嵌入式开发,近来有创业的念头。 问问大家订什么报纸比较适合我看,好了解一下现在市场的大背景。 培训嵌入式的机构有教驱动开发吗?深圳有哪些有名的培训机构啊? 进来的朋友都有分的,哈哈! …

查看全部问答>

基于STM32的IAP设计文档

感觉不错, 我就把原版的word转换为pdf分享过来了,资料感觉还是pdf比较好,各种pdf阅读器都可以,word不行,微软自己都好几个版本呢,、…

查看全部问答>

如何掌握好焊接技术

焊接实质上是将元器件高质量连接起来最容易实现的方法,因此,焊接技术是相当需要具备的。    一、 工具:    首先告诉大家的是焊接常用的工具和材料:电烙铁、焊料、助焊剂、钢丝钳、万用表等都是必备的工具 电烙铁、焊锡丝、松香   1 ...…

查看全部问答>

ccs3.3中使用profile看指令周期的问题

使用tms320c6713的芯片,在ccs3.3环境下使用profile 来观察代码所在的range所消耗的时间情况,这段代码将1000个16bit的有符号整形转换为float型,函数内容如下所示 void dataFormatTrs(Int16 *input, float *output, int size) {   in ...…

查看全部问答>

MSP430F6638IO端口中断问题,求解决。。

描述:MSP430F6638IO端口中断时,它的IO端口捕捉中断时是捕捉的上升沿还是下降沿?我知道能在PXIES中设置,相应的位为0时是上升沿,为1时是下降沿中断,但是如果初始化时不设置的话也就是默认的话是上升沿还是下降沿捕捉中断呢?手册上是说PXIES复 ...…

查看全部问答>