金牌会员
 
- 积分
- 1479
- 金钱
- 1479
- 注册时间
- 2016-1-25
- 在线时间
- 260 小时
|
最终实现效果:将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Õ½½¢STM32¿a·¢°å êμÑé39
//FATFS êμÑé
//¼¼êõÖ§3Ö£owww.openedv.com
//1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾
FIL fil;
FRESULT res;
UINT bww;
u8 buf[1030];
int main(void)
{
u32 total,free;
u8 t=0;
u16 i;
Stm32_Clock_Init(9); //Ïμí3ê±ÖóéèÖÃ
uart_init(72,115200); //′®¿ú3õê¼»ˉÎa115200
delay_init(72); //Ñóê±3õê¼»ˉ
// usmart_dev.init(72); //3õê¼»ˉUSMART
LED_Init(); //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
KEY_Init(); //3õê¼»ˉ°′¼ü
// W25QXX_Init(); //3õê¼»ˉW25Q128
my_mem_init(SRAMIN); //3õê¼»ˉÄú2¿Äú′æ3Ø
printf("STM32 SDcard test\r\n");
while(SD_Init())//¼ì2a2»μ½SD¿¨
{
printf("SD Card Error!\r\n");
delay_ms(500);
printf("Please Check! \r\n");
delay_ms(500);
LED0=!LED0;//DS0éá˸
}
exfuns_init(); //ÎafatfsÏà1رäá¿éêÇëÄú′æ
f_mount(fs[0],"0:",1); //1òÔØSD¿¨
while(exf_getfree("0",&total,&free)) //μÃμ½SD¿¨μÄ×üèYá¿oíê£óàèYá¿
{
printf("SD Card Fatfs Error!");
delay_ms(200);
delay_ms(200);
LED0=!LED0;//DS0éá˸
}
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);//′ò¿aò»¸öÎļt
i=f_size(&fil); //¶áè¡Îļt′óD¡
printf("date size:%d\r\n",i);
f_read (&fil, buf,1024,&bww); //¶á1024¸ö×Ö½úμÄêy¾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 功能 想对应的话 自动屏蔽掉中文编码的部分
基本上操作到这就完成了,就只有修改主程序中的文件就可以了,刚学习,所以有很多可能说的不是很明白的话,大家可以在楼下进行补充,方便你我他哈。
效果图
对应的程序:写数据操作大家自己添加,我并没有屏蔽掉写功能,所以写数据还是可以用的。
附件源码:感谢原子哥提供这个环境与资源哈
[url=]实验39 FATFS实验.rar[/url]
实验39 FATFS实验.rar
(3.23 MB, 下载次数: 136)
|
|