|
本帖最后由 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();
}
|
|