打印

stm32移植znfat笔记

[复制链接]
4293|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wzt19910506|  楼主 | 2012-4-13 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
至此,对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)
沙发
abin0415| | 2012-4-13 13:30 | 只看该作者
沙发

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

134

帖子

8

粉丝