历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2020年01月31日 | stm32——Fatfs文件系统读写文件

2020-01-31 来源:eefocus

因项目需求需要移植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);                  

    }


    exfuns_init();                  //为fatfs相关变量申请内存                 

    f_mount(fs[0],"0:",1);          //挂载SD卡,并分配盘符“0:”


    //以下不是必须

    while(exf_getfree("0",&total,&free))        //得到SD卡的总容量和剩余容量

    {

        LCD_ShowString(4,4,200,16,16,"Fatfs Error!");

        delay_ms(500);

        clearTopInfo(WHITE);              

        delay_ms(500);

    }   


创建文件(.txt) 

FA_CREATE_ALWAYS | FA_WRITE参数可用以下按需替换 

f_open函数相关参数

    //sprintf中的内容是从rtc中获取的时间,并放入newfilepath中。0:/是盘符(驱动器号)

    sprintf(newfilepath,"0:/%04d%02d%02d_%02d%02d%02d.txt",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);

    //

    res_ad=f_open(&fil_ad,newfilepath,FA_CREATE_ALWAYS|FA_WRITE);


写入文件(.txt) 

由于f_write只能写入char型数据,ad采样的int型数据(或其他的int/float/double等)必须转换为char才能正确保存,否则会出现乱码。 

f_write中的参数如下: 

&fil_ad为f_open中使用过的路径文件; 

write_buff为写的数据; 

6是要写入的字节数,具体看需求,如果想写入“1234567”但给的是6则‘7’将写不进去 

&bww_ad为实际写入的字节(待求证);


sprintf(write_buff,"%04drn",ad_value[i]*3300/4096);

res_ad=f_lseek(&fil_ad,f_size(&fil_ad));

res_ad=f_write(&fil_ad,write_buff,6,&bww_ad);


其中f_lseek(&fil_ad,f_size(&fil_ad));函数用于把文件读写指针移动到文件末尾。


读取文件


        f_open(&fil0,filepath,FA_READ);     //以只读方式打开文件


        for(i=0;i<232;i++)                  //由于知道文件里有232组数据所以设置232个循环

        {

            f_lseek(&fil0,i*6);             //每次读取之前先移动读写指针达到读写不同数据的目的

            f_gets(filedata[i],5,&fil0);    //读5个字节的数据


            printf("#S0000%sENn",filedata[i]);     //通过串口发送


        }


类似的,如果要读取某文件中的特定字符,比如‘A’,则可以:


    f_open(&fil0,filepath,FA_READ);

    while(1)

    {

        if(br == 0)                 //判断是否到达文件结尾

            break;                  //如果是,则退出


        f_read (&fil0, &readbuff, 1, br);   //每次读1字节

        if(readbuff == 'A')         //判断是否是A

        {

            //todo:your code

        }

    }

推荐阅读

史海拾趣

Crosspoint Solutions公司的发展小趣事

随着业务的发展,Crosspoint Solutions公司意识到单一市场无法满足其增长需求。于是,公司开始积极寻求国际合作机会,与多家国际知名电子企业建立了战略合作关系。通过技术共享和市场互补,公司成功打开了多个新的市场,业务遍布全球多个国家和地区。

ENERGIZER公司的发展小趣事

为了配合全球业务的发展,ENERGIZER在亚太地区设立了8个厂房和18个国家的办事处。其中,劲量(中国)有限公司于1992年开始进驻中国,并在1998年在天津设立了生产工厂。这一举措不仅促进了中国与国际间的技术交流与合作,还为中国的电池制造业带来了新的发展机遇。随着中国市场的不断扩大,ENERGIZER在中国的业务也逐渐壮大,成为了中国电池市场的重要参与者。

Condor公司的发展小趣事

为了配合全球业务的发展,ENERGIZER在亚太地区设立了8个厂房和18个国家的办事处。其中,劲量(中国)有限公司于1992年开始进驻中国,并在1998年在天津设立了生产工厂。这一举措不仅促进了中国与国际间的技术交流与合作,还为中国的电池制造业带来了新的发展机遇。随着中国市场的不断扩大,ENERGIZER在中国的业务也逐渐壮大,成为了中国电池市场的重要参与者。

德欣(COV)公司的发展小趣事

面对电子行业的快速发展和市场竞争的加剧,德欣公司始终将技术创新作为发展的核心动力。公司不断加大研发投入,引进先进的生产设备和技术人才,加强与高校和科研机构的合作。通过不断的技术创新和产品升级,德欣公司在保持传统产品优势的同时,也成功拓展了新的业务领域,实现了产业升级和可持续发展。

Adamant Co Ltd公司的发展小趣事

品质是电子行业的生命线。Adamant Co Ltd深知这一点,因此在品质管理方面下足了功夫。公司建立了严格的品质管理体系,从原材料采购到产品生产、检测、出厂等各个环节都严格把关。同时,公司还注重品牌建设,通过提升产品形象和服务质量,赢得了客户的信任和口碑。这些努力使得Adamant Co Ltd在行业中树立了良好的品牌形象。

Engineered Components Co公司的发展小趣事

在追求经济效益的同时,ECC也注重可持续发展和环保责任。他们积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。ECC还投入资金建设了废水处理设施和废气处理设备,确保生产过程中的废弃物得到有效处理。此外,ECC还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了ECC的社会责任感,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

学习感到很困难我该如何是好

万事开头难,初学阶段感到学习无线电这门科学很困难是非常正常的事情,看不懂、记不住等问题是必然会遇到的,但是总有开头、起步的过程。认识到学习电子技术这门科学的难度,树立一定能够学好的信心,运用科学的学习方法,学习中不断总结适合自己的 ...…

查看全部问答>

求助:麻烦论坛哪位大神有时间来帮下忙,感激不尽~

我是刚开始学习硬件设计的,手上有一块stm32f的板子,工具是IAR EMbedded workbench for arm evaluation。 任务是用这块板子学习arm,求助来位大神帮我指导下学习,下载一些example但是一载入就报错,还不能在板子上debug,只能用一个软件自带的ex ...…

查看全部问答>

承接电子设计(单片机)项目

承接电子设计(单片机)项目 (一)、PCB LAYOUT(2层 or 4层) 老牛承接专业抄板、画板,质优价廉,可每天查看画板进度,有问题及时沟通。 可加我QQ看画过的样板,因为老牛是个人接活,所以价钱肯定比抄板公司低,希望各位同行有活之余多多照顾。 ...…

查看全部问答>

哪位老大用过周立功的 easyarm2104?

为什么的我用ISP烧的程序没法运行啊。。。 入口点地址。RO、RW 都改了, 也能传到板子上, 可就是没反映啊 谢谢…

查看全部问答>

为什么有些人不懂LINUX操作系统,也在搞嵌入式开发

我听同学说他们公司搞嵌入式的那些人好多都不熟悉linux. 那为什么很多人都说学嵌入式要学linux? 是不是搞嵌入式应用软件开发的跟一般运行于PC机上的软件开发实质上没什么区别? 而搞嵌入式系统软件开发就要熟悉linux? …

查看全部问答>

想用运放做一个降压处理但是要采集非线性的电压中us级的一段电压值

因为采集的电压的超过ADC的输入范围, 现想用运放做一个降压处理,但是要采集非线性的电压中us级的一段电压值。 这样的该如何设计,从哪下手啊?…

查看全部问答>

【招兵帖】爱淘的淘友们都进来看看

以为坛友们淘到最便宜,最实用的东西为主旨,为论坛团购计划做坚强后盾,现招兵买马,组织淘货小组。   淘货小组主要负责为论坛搜的团购宝贝,所以需满足一下两点: 1.爱逛淘宝(不仅仅是淘宝哦) 2.爱淘货 3.愿意为坛友淘得宝贝做贡献 ...…

查看全部问答>

三行代码实现字符与字符串的串口输出

/******************************************************************************** 函数名称  : uat_putchr* 描述      : 串口发送字符* 输入     ...…

查看全部问答>

求个阳历转阴历的C语言代码

最近做一个电子时钟,要求要阳历转阴历(2000-2099)的,所以来这里求助了。…

查看全部问答>

学习linux用那本教材较好

学习linux用那本教材较好…

查看全部问答>