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:30 编辑
终于解决了。。。因为我设置了看门狗,1秒钟周期。 遗憾的是,擦除flash一个sector就会导致看门狗复位。 更改看门狗为2秒周期就好了。
奇怪的是,debug模式下,看门狗应该是默认停止的。 但是我单行运行,flash擦除是正常的。 使用“运行到光标”调试,flash擦除就错误。
这说明,debug“停止”时,计时器是停止的,debug“运行”时,计时器是运行的。
flash一个128K的sector擦除,耗时确实超过1秒钟了。
caicaptain2 发表于 2020-6-24 11:25
终于解决了。。。因为我设置了看门狗,1秒钟周期。 遗憾的是,擦除flash一个sector就会导致看门狗复位。 更 ...
调试模式默认是开启的。
如果要关闭,需要调用那个冻结函数。 eric2013 发表于 2020-6-25 08:18
调试模式默认是开启的。
如果要关闭,需要调用那个冻结函数。
困惑是,debug模式下,MCU都复位了,jlink调试连接居然没有断开,也没有什么警告。。。。
害得我在这个简单功能上折磨了好几天。。。。 我都没开看门狗为什么我转两圈就卡里面了
页:
[1]