使用stm32g070 HAL库时,想要写入flash时,必须要执行一次擦除,不让就不能连续写入。
是代码有问题吗? 还是有地方没有配置?
uint8_t FLASH_Remove_Page(uint32_t WriteAddr)
{
uint32_t FirstPage = 0;
uint32_t NbOfPages = 0;
uint32_t PageError = 0;
uint32_t addrx = 0;
uint32_t endaddr = 0;
uint32_t *u32pBuff;
HAL_StatusTypeDef FlashStatus = HAL_OK;
FLASH_EraseInitTypeDef EraseInitStruct = {0};
//u32pBuff = pBuffer;
addrx = WriteAddr;
//endaddr = WriteAddr + NumToWrite * (sizeof(uint64_t)/sizeof(uint8_t));
HAL_FLASH_Unlock();
if (FLASH_LOG_ADD == addrx || FLASH_CFG_ADD == addrx || FLASH_FACTORY_SET == addrx)
{
/* Get the 1st page to erase */
FirstPage = GetPage(addrx);
/* Get the number of pages to erase from 1st page */
NbOfPages = GetPage(addrx) - FirstPage + 1;
/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Page = FirstPage;
EraseInitStruct.NbPages = NbOfPages;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
}
}
FlashStatus = FLASH_WaitForLastOperation(1000); //等待上次操作完成
HAL_FLASH_Lock();
return OK;
}
void FLASH_JustWrite_32Bit(uint32_t WriteAddr, uint32_t *pBuffer, uint32_t NumToWrite) //只写入不擦除
{
HAL_StatusTypeDef FlashStatus = HAL_OK;
FLASH_EraseInitTypeDef EraseInitStruct = {0};
uint32_t endaddr = 0;
uint32_t addrx;
uint32_t FirstPage = 0;
uint32_t NbOfPages = 0;
/* Get the 1st page to erase */
FirstPage = GetPage(addrx);
/* Get the number of pages to erase from 1st page */
NbOfPages = GetPage(addrx) - FirstPage + 1;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = FLASH_BANK_1; //操作BANK1
EraseInitStruct.Page = FirstPage;
EraseInitStruct.NbPages = NbOfPages
HAL_FLASH_Unlock(); //解锁
addrx = WriteAddr;
endaddr = WriteAddr + NumToWrite * (sizeof(uint32_t) / sizeof(uint8_t));
while (WriteAddr < endaddr) //写数据
{
FLASHRUN.u8SaveCount = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST, addrx, (uint64_t)pBuffer);
if (FLASHRUN.u8SaveCount == HAL_OK)
{
addrx = addrx + 4;
pBuffer++;
}
else
{
// return ;
break;
}
}
HAL_FLASH_Lock(); //上锁
}
我是擦除一次后,再写入。然后再重新上电后,就不能继续在剩余的地址写入了。
FLASH的操作都是按块或者扇区来的
写入之前必须先擦除,严格的说应该是写入时只支持从1-->0, 如果FLASH某一地址上的值不为全1,则写入大概率会出错
想要保留扇区其他值的话
1. 从FLASH中读出一个扇区或者块的内容存入RAM
2. 将想要写入的值直接在`1步骤中读出的`RAM中修改
3. 擦除FLASH
4. 将修改好的RAM中的数据整个写入FLASH中
这玩意好像每次写都要擦除一下