至此,对fat32系统已经有了一个大概的了解,本以为自己可以编写个出来,现在的水平还是可望而不可及啊。所以还是先进行移植别人写过的。不移不知道,一移吓一跳:自己欠缺的部分这次可算“光身暴露”了。 
移植看似就是把函数的接口给接上,想想挺简单。但还有很多问题,首先znfat是基于8051单片机的一个文件系统,8051是八位单片机,而stm32是32位的,这个在mytype.h里面有申明: 
//#define UINT8X  unsigned char xdata 
#define UINT8   unsigned char 
//#define UINT16X unsigned int xdata 
#define UINT16  unsigned int 
//#define UINT32X unsgined long xdata 
#define UINT32  unsigned long  
 
//#define INT8X   char xdata 
#define INT8    char  
//#define INT16X  int  xdata 
#define INT16   int 
//#define INT32X  long xdata 
#define INT32   long 
Stm32的大部分数据类型和8051定义的一样,就是红色部分的char xdata,int xdata,long xdata这几种类型没有(程序中也没有用到所以直接屏蔽掉就可以了)。 
另一个问题就是小端大端的问题,8051用的是大端模式,而stm32用的是小端模式。所以这一部分也要修改.znfat.c中有个函数LE2BE就是把从sd卡读回的小端模式转为大端,对stm32来说这个函数就多余了,屏蔽掉?编译器下会出现一大堆错误,因为在后面很多函数都调用了LE2BE这个函数了,所以最简单的办法就是修改它。 
原来是这样的: 
UINT32 LE2BE(UINT8 *dat,UINT8 len)  
{ 
 UINT32 temp=0; 
 UINT32 fact=1; 
 UINT8  i=0; 
 for(i=0;i<len;i++) 
 { 
  temp+=dat*fact; 
  fact*=256; 
 } 
 return temp; 
} 
修改后的样子: 
UINT32 LE2BE(UINT8 *dat,UINT8 len)  
{ 
 UINT32 temp=0; 
 UINT32 fact=1; 
 UINT8  i=0; 
 if(MCU!=0) 
 { 
         for(i=0;i<len;i++) 
         { 
          temp+=dat*fact; 
          fact*=256; 
         }          
 } 
 else temp=*dat; 
 return temp; 
} 
可以看到多定义了一个变量mcu,来判断是51还会stm32,如果是stm32就把mcu附0,这样直接跳到else语句执行。然后返回读取回来的原数据。 
下面关键的接口,把自己编写好的sd卡驱动按照znfat里面的接口来编写。编好后替换掉znfat中UINT8 FAT32_ReadSector(UINT32 addr,UINT8 *buf)函数里面的SD_ReadSingleBlock。接下来的write同理。另外还有一个问题就是znfat声明的extern要在外部的主函数里面进行定义,要不然也会报错。 
自己还遇到一个令人蛋疼的问题(),总看着程序没问题,但是编译器提示:..\znfat\znfat.h(192): warning:  #1295-D: Deprecated declaration FAT32_is_MBR - give arg types。解决办法就是:嘿嘿,其实很简单在.h文件里的UINT8 FAT32_is_MBR();函数的括号里添加void。应该是MDK的规则,在.h里面声明的函数如果不带参数括号里面必须加入void。好了,终于编译通过了:0错误,0警告。下载到板子上调试(功能是如果FAT32_Init初始化成功就让lcd屏亮红色):现象出现了……死机!后来用jlink调试发觉到一运行到FAT32_Init就死到那……然后一步一步调试,进入FAT32_Init之后运行到下面红色部分就不行了…… 
void FAT32_Init() 
{ 
 struct FAT32_BPB *bpb; 
 
 bpb=(struct FAT32_BPB *)(FAT32_Buffer);                
 pArg->DEV_No=Dev_No; 
 
 pArg->BPB_Sector_No   =FAT32_Find_DBR();               
 pArg->BPB_Sector_No   =FAT32_Find_DBR(); 
 
再点下一步,程序跳转到一条指令不动了: 
如下 
HardFault_Handler\ 
                PROC 
                EXPORT  HardFault_Handler         [WEAK] 
                B       . 
                ENDP    
指向B   .不动了……看不懂啊,汇编不懂,网上一搜说是什么可能是堆栈溢出和数组越界,什么叫数组越界……自己编程从来都没有接触过这些概念啊……暂时就卡到这了,等解决了以后再续吧!   
 
 
fat_test.zip
(1.01 MB, 下载次数: 141)
 |   
     
  
 |