caicaptain2 发表于 2020-6-23 11:13:01

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

本帖最后由 caicaptain2 于 2021-1-6 09:25 编辑

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


//FLASH写入数据测试    size是字节数
void User_Flash_WriteFrontConfig(FrontConfigDataDef *configdata)
{
uint32_t i = 0;
uint32_tPageError=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();
}


caicaptain2 发表于 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秒钟了。

eric2013 发表于 2020-6-25 08:18:14

caicaptain2 发表于 2020-6-24 11:25
终于解决了。。。因为我设置了看门狗,1秒钟周期。 遗憾的是,擦除flash一个sector就会导致看门狗复位。 更 ...

调试模式默认是开启的。

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

caicaptain2 发表于 2020-6-25 11:42:03

eric2013 发表于 2020-6-25 08:18
调试模式默认是开启的。

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

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

小杨同学 发表于 2023-9-14 20:26:17

我都没开看门狗为什么我转两圈就卡里面了
页: [1]
查看完整版本: HAL库擦除内部Flash死循环了。。。-已解决