使用stm32g070 HAL库时,想要写入flash时,必须要执行一次擦除,不让就不能连续写入。

问题遇到的现象和发生背景

使用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中

这玩意好像每次写都要擦除一下