打印

STM32F103ZET6 + K9f1G08 + FATFS 调试之不解

[复制链接]
3770|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hqqymh|  楼主 | 2010-4-21 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试的时候发现 程序经常跑进 HardFaultException() {while(1);} 这个函数里头! 因为K9f1G08是大页的nand 所以定义的缓冲区一个接受一个发送都是2k! 后来我将缓冲区的定义放到 fs的测试函数里头可以正常运行, 但后来我又将这两个数组定义成全局的 又跑到了HardFaultException() {while(1);} 。 我再次将数组定义到函数里头发现程序还是跳到 HardFaultException() {while(1);}  我这搞不懂这是什么原因呢? 假若要想找出真正的原因,该怎么调试查看呢? 请各位朋友指点一下 谢谢大家。 下面是fatfs 的测试函数:
   void test_fatfs(void)
  {
   FATFS fs;
   FIL fl;
   FATFS *pfs;
   DWORD clust;
   unsigned int r,w,i;
   FRESULT  res;

   uint8 RxBuffer[2048];
   uint8 TxBuffer[2048];
   
  // for mount
   res=f_mount(0,&fs);
   printf("f_mount=%x \n\r",res);
   
  // for format
   //res=f_mkfs(0,1,2048);  //MUST Format for New NANDFLASH !!!
   //printf("f_mkfs=%x \n\r",res);
  
  // for
   pfs=&fs;
   res = f_getfree("/", &clust, &pfs);
   printf("f_getfree=%x \n\r",res);
   printf("\n\r%lu MB total drive space."
       "\n\r%lu MB available.\n\r",
     (DWORD)(pfs->max_clust - 2) * pfs->csize /2/1024,
     clust * pfs->csize /2/1024);
   
  // for read
      res=f_open(&fl,"/test2.dat",FA_OPEN_EXISTING | FA_READ);
      printf("f_open=%x \n\r",res);
   for(i=0;i<2;i++)
   {
    for(r = 0; r < NAND_PAGE_SIZE; r++)
    {
     RxBuffer[r]= 0xff;
    }
   
    res=f_read(&fl,RxBuffer,NAND_PAGE_SIZE,&r);
    printf("f_read=%x \n\r",res);
    if(res || r == 0)break;
    for(r = 0; r < NAND_PAGE_SIZE; r++)
       {
           printf("D[%08x]=%02x ",(i*NAND_PAGE_SIZE+r),RxBuffer[r]);
           if((r%8)==7)
           {printf("\n\r");}
       }
      
   }
   f_close(&fl);
  // for write
   res=f_open(&fl,"/test2.dat",FA_CREATE_ALWAYS | FA_WRITE);
   printf("f_open=%x \n\r",res);
   for(i=0;i<2;i++)
   {
    for(w = 0; w < NAND_PAGE_SIZE; w++)
    {
     TxBuffer[w]=((w<<0)&0xff);
    }
          res=f_write(&fl,TxBuffer,NAND_PAGE_SIZE,&w);
          printf("f_write=%x \n\r",res);
    if(res || w<NAND_PAGE_SIZE)break;
   
   }
   f_close(&fl);
   
  // for umount
   f_mount(0,NULL);
  }
沙发
vigia| | 2010-4-21 10:55 | 只看该作者
我一般在调试HardFault的时候,有两个步骤

1, 在发生HardFaultException的时候,去看stack里的数据,在stack里会保存一些寄存器的值,还有最后一次跳转时所保存的函数地址。从这个函数地址可以找到导致HardFault发生的代码,从出错的代码就可以找到出错的原因。

2, 如果从出错代码找不到出错原因,那就需要打开所有的fault,因为在其他fault没有打开的情况下,任何fault都会导致hardfault。打开所有fault,再看内核寄存器的值,比如PRIMASK之类的,就能找到出错的蜘丝马迹了。

使用特权

评论回复
板凳
hqqymh|  楼主 | 2010-4-21 21:17 | 只看该作者
谢谢你,我再调试查看出错的原因!

使用特权

评论回复
地板
xiepengchenghn| | 2010-12-22 14:50 | 只看该作者
mark

使用特权

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

本版积分规则

个人签名:继续奋斗

8

主题

43

帖子

0

粉丝