6398|3

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103ZET6+K9f1G08+FATFS调试之不解 [复制链接]

在调试的时候发现 程序经常跑进 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);
  }
此帖出自stm32/stm8论坛

最新回复

                                 mark  详情 回复 发表于 2010-12-22 14:50
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我一般在调试HardFault的时候,有两个步骤

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

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

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 谢谢你,我再调试查看出错的原因!
此帖出自stm32/stm8论坛
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 mark
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表