OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8257|回复: 5

stm32f107vct6连续擦除片内Flash时进入HardFault,求助各位大神

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-12-22
在线时间
0 小时
发表于 2013-12-26 10:37:09 | 显示全部楼层 |阅读模式

小弟,最近在实验stm32 IAP。在实验过程中发现连续擦除片内Flash区域的时候会进入HardFault。刚开始使用的是for循环(Flash解锁和上锁的步骤我在其余代码部分已添加上):
  case INSIDE_FLASH_APP_START_ADDR:   /*擦除APP区域128Kbytes空间*/
  {
      for(i = 0; i < 64; i++)
     {
           if (FLASH_ErasePage(FlashAddress) == FLASH_COMPLETE)
          {
             FlashAddress += 2*1024;
          }
          else
         {
           return 1;
         }  
     } 
   
     return 0;
  }
   
我期望擦除的区域大小为128Kbytes,而stm32f107vct6的一个Page是2Kbytes,因此我需要连续擦除64次。但是当我全速运行时程序就会进入HardFault;如果我在for循环里单步执行则这段程序可以通过。  后来我不死心,直接将for循环替换成了擦64次:
  erase_addr = INSIDE_FLASH_APP_START_ADDR;
   
   FLASH_If_Unlock();
   
   FLASH_ErasePage(erase_addr+0*2*1024);   
   FLASH_ErasePage(erase_addr+1*2*1024);
   FLASH_ErasePage(erase_addr+2*2*1024);
   FLASH_ErasePage(erase_addr+3*2*1024);
   FLASH_ErasePage(erase_addr+4*2*1024);
   FLASH_ErasePage(erase_addr+5*2*1024);
   .                           .                           .
   .                           .                           .
   .                           .                           .
   FLASH_ErasePage(erase_addr+60*2*1024);
   FLASH_ErasePage(erase_addr+61*2*1024);
   FLASH_ErasePage(erase_addr+62*2*1024);
   FLASH_ErasePage(erase_addr+63*2*1024);

 
   FLASH_If_Lock();
及时写成这样也还是会出现想通的问题,全速运行进入HardFault,单步执行可以通过,或者在这一长串的FLASH_ErasePage()函数之间多打几个断点,也可以通过。


恳请给位大神指点怎么破????在此先谢过了!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-26 10:55:47 | 显示全部楼层
回复【楼主位】littleway:
---------------------------------
每次擦除之后,加入延时等待下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-12-22
在线时间
0 小时
 楼主| 发表于 2013-12-26 12:07:04 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢楼主,你说的加延时的方法我也试过,用如下的延时函数,每次擦写完delay_ms(50),问题依然存在。
void delay_ms(u16 time)
{
    u16 i;
    i = 0;

    while(time--)
   {
       i = 10000;
       while(i--);
    }
}
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-12-22
在线时间
0 小时
 楼主| 发表于 2013-12-26 12:15:41 | 显示全部楼层
为了能更清楚地表述问题,我将Flash擦除部分的代码单独整理成了一个工程上传,希望各位大神能够指点迷津!谢谢

inside_flash_pro.zip

6.29 MB, 下载次数: 291

回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-12-22
在线时间
0 小时
 楼主| 发表于 2013-12-26 18:12:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大神,
    这个问题虽然还没明白原因但是找到了解决的方法了。其实这个问题跟你这篇帖子还是非常相似的。  
           http://www.openedv.com/posts/list/24177.htm
我在每次擦除Flash age之后加入了一个printf()函数,然后就不会进入HardFault了。这个问题真的很奇怪,你在上面的那篇帖子里也说对于加printf()函数可以解决的原因不太清楚。然后你使用的是修改寄存器。但是我对比了以下107和407,107的Flash寄存器里没有FLASH->ACR的DCEN。所以除了加printf之外,没有其他的解决办法了。如果你明白原因的话,麻烦你指点以下。谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-26 21:04:38 | 显示全部楼层
回复【5楼】littleway:
---------------------------------
我那个主要是没仔细看文档,导致漏看了一些东西,所以...
后面看文档才找到解决办法。
你这个也好好看看107的编程文档吧,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 09:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表