硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4633|回复: 4
收起左侧

[STM32CubeF4] HAL库擦除内部Flash死循环了。。。-已解决

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-6-23 11:13:01 | 显示全部楼层 |阅读模式
本帖最后由 caicaptain2 于 2021-1-6 09:25 编辑

这是一个非常简单的操作。网上和例程都很简单。 但是我这个有点诡异。 已经折腾几个小时无解了,在线求助。。。。
特别是 HAL_FLASHEx_Erase()这个函数,如果调试中单步运行到函数内部,擦除成功。 如果调试运行“这一行”这个函数,就执行不出来了。。。。即使无调试直接运行,擦除也不成功。


//FLASH写入数据测试    size是字节数
void User_Flash_WriteFrontConfig(FrontConfigDataDef *configdata)
{
  uint32_t i = 0;
  uint32_t  PageError=0;
  uint32_t tempuint32=0;
  FLASH_EraseInitTypeDef f;
  f.TypeErase=FLASH_TYPEERASE_SECTORS;
  f.VoltageRange=FLASH_VOLTAGE_RANGE_3;
  f.Sector= DATA_FLASH_SECTOR;
  f.NbSectors=1;
  f.Banks=FLASH_BANK_1;

  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();

  //1、解锁FLASH
  HAL_FLASH_Unlock();
    //2、擦除FLASH         
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
                           FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

    HAL_FLASHEx_Erase(&f, &PageError);

    //3、对FLASH烧写
          for(i = 0;i< sizeof(FrontConfigDataDef)/4 ;i++)
         {
     tempuint32= *((uint32_t*)configdata+i);
                 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD , DATA_FLASH_ADDR + i*4, tempuint32);
         }
    //4、锁住FLASH
  HAL_FLASH_Lock();
    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
}


回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2020-6-24 11:25:07 | 显示全部楼层
本帖最后由 caicaptain2 于 2020-6-24 11:30 编辑

终于解决了。。。因为我设置了看门狗,1秒钟周期。 遗憾的是,擦除flash一个sector就会导致看门狗复位。 更改看门狗为2秒周期就好了。  
奇怪的是,debug模式下,看门狗应该是默认停止的。 但是我单行运行,flash擦除是正常的。 使用“运行到光标”调试,flash擦除就错误。
这说明,debug“停止”时,计时器是停止的,debug“运行”时,计时器是运行的。

flash一个128K的sector擦除,耗时确实超过1秒钟了。
Snipaste_2020-06-24_11-29-53.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-6-25 08:18:14 | 显示全部楼层
caicaptain2 发表于 2020-6-24 11:25
终于解决了。。。因为我设置了看门狗,1秒钟周期。 遗憾的是,擦除flash一个sector就会导致看门狗复位。 更 ...

调试模式默认是开启的。

如果要关闭,需要调用那个冻结函数。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2020-6-25 11:42:03 | 显示全部楼层
eric2013 发表于 2020-6-25 08:18
调试模式默认是开启的。

如果要关闭,需要调用那个冻结函数。

困惑是,debug模式下,MCU都复位了,jlink调试连接居然没有断开,也没有什么警告。。。。
害得我在这个简单功能上折磨了好几天。。。。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-9-14 20:26:17 | 显示全部楼层
我都没开看门狗为什么我转两圈就卡里面了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 00:42 , Processed in 0.213295 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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