通过先擦除flash扇区后写入的方式往Flash中写数据,但再次读出后内容和写入的不同。
此时,应该通过断点调试,重点检测擦除flash是否执行的比较快,如果擦除一闪而过,同时擦除后的对应地址没有变为全0xff,说明未执行擦除,紧接着写入肯定会出问题。
问题的原因就是:擦除函数写的太简单,必须:先解锁flash,然后清除标志位,然后设置各项参数执行擦除,然后上锁(如果紧跟flash写入,且写入后有上锁,则此时上锁貌似不是必须?)。
uint8_t flash_erase(uint32_t StartSector)
{
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t SECTORError = 0;
HAL_FLASH_Unlock();
/* Clear pending flags (if any) */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
// StartSector = GetSector(address);
// EndSector = GetSector(address+size);
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
EraseInitStruct.Sector = StartSector;
EraseInitStruct.NbSectors = 1;
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError)!=HAL_OK)
{
return 0;
}
HAL_FLASH_Lock();
return 1;
}
没有加清除标志位的话,貌似有时候可以正确写入,估计是刚开始flash没出错。一旦出错,因为没有清除错误标志,后续的擦除操作都会被跳过。