OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4355|回复: 9

FATFS文件系统裁剪[30K左右]为IAP准备

[复制链接]

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2018-5-17 12:53:55 | 显示全部楼层 |阅读模式
最终实现效果:将FATFS文件系统裁剪为30K左右大小,为以后在小flash单片机中进行IAP升级做准备

       最近在学习原子哥的IAP实验中,准备利用SD卡进行在线IAP升级实验。看了下原子哥的SD卡实验,以及FAFTS文件系统实验。结果发现FAFTS文件系统对于我们只需要进行IAP在线升级的话,太过于庞大了达到了将近200K大小,对于以后在STM32F103RBT6进行移植的话 根本不能用【注意:SDIO接口的话,STM32在100脚以上的单片机才有,所以后续的话肯定是要用SPI方式去读SD卡的,正所谓饭要一口一口吃,因为这两天也刚接触,所以直接用SDIO接口方式做的测试】
      硬件上区别:因为我使用的是神舟三号的板子,所以在KEY和LED的IO口操作上有所更改,你们可以根据你们的IO口进行相应的修改,SDIO接口的话都一样没有什么区别,唯一不同的是神舟三号的SD卡接口第10脚SD_NCD,是接在了PC_6上的,而原子哥是直接悬空的。所以这部分我也只是在原子哥的sdio_sdcard.c文件中的IO初始化里加了这一句话而已
         SD_Error SD_Init(void)

        GPIOC->CRH&=0XF0FFFFFF;
        GPIOC->CRH|=0X03000000;        //PC.6 推挽输出
        GPIOC->ODR|=1<<6;        //PC6 上拉
       
        GPIOC->CRH&=0XFFF00000;
        GPIOC->CRH|=0X000BBBBB;        //PC.8~12



程序修改:这边大家可以先去看看原子哥的实验39 FATFS实验,我的程序就是在这个程序基础上修改的。不过大家在做之前先去看看原子哥75讲和76讲的视频,毕竟你要先理解这个概念才不会懵逼了哈。fafts文件系统,很大的一部分空间是被长文件命名即_USE_LFN与936字库编码所占用了,所以关掉这块的话,整个文件系统大小就降下来了。说一下,我主要去掉了——LFN和——SPIflash这块,以下这些就是我修改后的主函数代码,具体的大家可以看现在我附件的程序,里面都有备注。

[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"                           
#include "key.h"     
//#include "usmart.h"
#include "sram.h"
#include "malloc.h"
#include "sdio_sdcard.h"  
//#include "w25qxx.h"   
#include "ff.h"  
#include "exfuns.h"   
//ALIENTEK&#213;&#189;&#189;¢STM32&#191;a·¢°&#229; êμ&#209;é39
//FATFS êμ&#209;é
//&#188;&#188;ê&#245;&#214;§3&#214;£owww.openedv.com
//1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190;
FIL fil;
FRESULT res;
UINT bww;
u8 buf[1030];
int main(void)
{               
        u32 total,free;
        u8 t=0;
  u16 i;       
        Stm32_Clock_Init(9);                //&#207;μí3ê±&#214;óéè&#214;&#195;
        uart_init(72,115200);                //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
        delay_init(72);                                    //&#209;óê±3&#245;ê&#188;&#187;ˉ  
//        usmart_dev.init(72);                //3&#245;ê&#188;&#187;ˉUSMART               
        LED_Init();                                          //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
        KEY_Init();                                        //3&#245;ê&#188;&#187;ˉ°′&#188;ü
//        W25QXX_Init();                                //3&#245;ê&#188;&#187;ˉW25Q128
        my_mem_init(SRAMIN);                //3&#245;ê&#188;&#187;ˉ&#196;ú2&#191;&#196;ú′&#230;3&#216;
        printf("STM32 SDcard test\r\n");       
        while(SD_Init())//&#188;ì2a2&#187;μ&#189;SD&#191;¨
        {
                printf("SD Card Error!\r\n");
                delay_ms(500);                                       
                printf("Please Check! \r\n");
                delay_ms(500);
                LED0=!LED0;//DS0éá&#203;&#184;
        }
        exfuns_init();                                                        //&#206;afatfs&#207;à1&#216;±&#228;á&#191;éê&#199;&#235;&#196;ú′&#230;                                 
  f_mount(fs[0],"0:",1);                                         //1ò&#212;&#216;SD&#191;¨
       
        while(exf_getfree("0",&total,&free))        //μ&#195;μ&#189;SD&#191;¨μ&#196;×üèYá&#191;oíê£óàèYá&#191;
        {
                printf("SD Card Fatfs Error!");
                delay_ms(200);                  
                delay_ms(200);
                LED0=!LED0;//DS0éá&#203;&#184;
        }                                                                                                                                         
        printf("FATFS OK!\r\n");         
        printf("SD Total Size:   %d  MB\r\n",total>>10);         
        printf("SD  Free Size:   %d  MB\r\n",free>>10);        
       
        res=f_open (&fil,"0:/TEST.bin",FA_READ);//′ò&#191;aò&#187;&#184;&#246;&#206;&#196;&#188;t
       
  i=f_size(&fil);  //&#182;áè&#161;&#206;&#196;&#188;t′óD&#161;
        printf("date size:%d\r\n",i);
       
  f_read (&fil, buf,1024,&bww);        //&#182;á1024&#184;&#246;×&#214;&#189;úμ&#196;êy&#190;Y
        printf("read date:%d\r\n",bww);       
        for(i=0;i<1024;i++)printf(" %x ",buf);
       
        f_close(&fil);
       
  
        while(1)
        {
                t++;
                delay_ms(200);                                           
                LED0=!LED0;
        }
}[/mw_shl_code]      
看过原子哥的视频的人都知道,原子哥在里面已经有介绍了,fafts文件系统的功能配置都是通过 ----#include "ffconf.h"-----这个文件来配置的
我主要说一下我这部分修改的内容,其它具体相对应配置的话里面都有详细的说明
屏蔽的文件与函数有以下几个:
//删除了原子哥的液晶显示程序,所有效果全部通过串口打印查看
//#include "usmart.h"  //主函数中屏蔽   注:如果想像原子哥那有通过串口调试的话取消对应。H文件和初始化函数的屏蔽操作就可以了
//#include "w25qxx.h"  //主函数中屏蔽
//#include "fattester.h"         // "exfuns.c"中屏蔽
//myfree(SRAMIN,fileinfo.lfname);---》主要在fattester.c文件中  fattester.c为原子哥自创的快速读写SD卡内容,所以我们很多读写操作就可以参考里面的函数了

#if !_USE_LFN || _CODE_PAGE != 936
//#error This file is not needed in current configuration. Remove from the project. //屏蔽cc963.c文件中的这段,防止不使用长文件名时编译报错
#endif


在 #include "ffconf.h"文件中的第96行左右
#define        _USE_LFN        0    //   0: Disable LFN feature. _MAX_LFN has no effect.  关闭long file name 功能  想对应的话 自动屏蔽掉中文编码的部分
基本上操作到这就完成了,就只有修改主程序中的文件就可以了,刚学习,所以有很多可能说的不是很明白的话,大家可以在楼下进行补充,方便你我他哈。
1.png 效果图
对应的程序:写数据操作大家自己添加,我并没有屏蔽掉写功能,所以写数据还是可以用的。

附件源码:感谢原子哥提供这个环境与资源哈
[url=]实验39 FATFS实验.rar[/url]

实验39 FATFS实验.rar (3.23 MB, 下载次数: 136)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-5-17 14:19:57 | 显示全部楼层
直接语言选项选为英文就好啦,这样就不会调用中文转码数组。我记得以前试过单纯一个文件系统就20多KB还是多少,小得很
回复 支持 反对

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
 楼主| 发表于 2018-5-17 15:22:39 | 显示全部楼层
a3748622 发表于 2018-5-17 14:19
直接语言选项选为英文就好啦,这样就不会调用中文转码数组。我记得以前试过单纯一个文件系统就20多KB还是多 ...

我试过直接选择英文的,但用原子哥程序来很多地方就报错,试着去更改了一下。貌似没有成功。毕竟现在刚学,所以暂时就摸索出现在这个。
回复 支持 反对

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-5-17 15:59:28 | 显示全部楼层
sodermalm 发表于 2018-5-17 15:22
我试过直接选择英文的,但用原子哥程序来很多地方就报错,试着去更改了一下。貌似没有成功。毕竟现在刚学 ...

哈哈,原子哥的例程用的是旧版本的了。

去官网下载个新版本,自己新建工程移植啊,挺有意思的。
回复 支持 反对

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
 楼主| 发表于 2018-5-17 16:10:30 | 显示全部楼层
a3748622 发表于 2018-5-17 15:59
哈哈,原子哥的例程用的是旧版本的了。

去官网下载个新版本,自己新建工程移植啊,挺有意思的。

恩,后面有时间可以下载个来试试。经过你提醒,我刚发现了  将 fafts下 diskio.c 中w25qxx外部flash部分全部删掉,的确可以减少到20K一下。
回复 支持 反对

使用道具 举报

3

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2015-3-1
在线时间
123 小时
发表于 2018-5-18 08:39:24 | 显示全部楼层
楼主确认100脚以下的没SDIO?确认了再发吧
- -个性的签名
回复 支持 反对

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2018-5-18 09:10:08 | 显示全部楼层
Ray______ 发表于 2018-5-18 08:39
楼主确认100脚以下的没SDIO?确认了再发吧

SDIO只适用于大容量stm32f101xx和stm32f103xx系列产品
回复 支持 反对

使用道具 举报

3

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2015-3-1
在线时间
123 小时
发表于 2018-5-18 09:25:26 | 显示全部楼层
msq001 发表于 2018-5-18 09:10
SDIO只适用于大容量stm32f101xx和stm32f103xx系列产品

我是在质问楼主.......不然会给人造成误导,难不成我不知道。
- -个性的签名
回复 支持 反对

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
 楼主| 发表于 2018-5-18 11:17:24 | 显示全部楼层
Ray______ 发表于 2018-5-18 08:39
楼主确认100脚以下的没SDIO?确认了再发吧

不知道这位楼友是不是没有看清楚哈。我说了,刚学习,所以有很多可能说的不是很明白的话,大家可以在楼下进行补充,方便你我他。至于说100脚以下没有SDIO接口的,是我当前使用的芯片进行对照的。毕竟我们都是依旧所需要的功能进行选型的,所以我可能有些地方的确会说的不是很严谨。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-8-31
在线时间
4 小时
发表于 2018-9-7 11:01:51 | 显示全部楼层
谢谢分享!我也在考虑用SD卡来进行IAP升级。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表