current position:Home>When using stm32g070 Hal library, if you want to write to flash, you must perform an erase. If you don't let it, you can't write continuously.

When using stm32g070 Hal library, if you want to write to flash, you must perform an erase. If you don't let it, you can't write continuously.

2022-01-27 03:58:34 CSDN Q & A

The phenomenon and background of the problem

Use stm32g070 HAL library , Want to write flash when , An erase must be performed , If you don't, you can't write continuously .

Is there a problem with the code ? There are still some places without configuration ?

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); // Wait for the last operation to complete     HAL_FLASH_Lock();    return OK;}
void FLASH_JustWrite_32Bit(uint32_t WriteAddr, uint32_t *pBuffer, uint32_t NumToWrite) // Write only, do not erase {    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; // operation BANK1    EraseInitStruct.Page = FirstPage;    EraseInitStruct.NbPages = NbOfPages    HAL_FLASH_Unlock(); // Unlock     addrx = WriteAddr;    endaddr = WriteAddr + NumToWrite * (sizeof(uint32_t) / sizeof(uint8_t));    while (WriteAddr < endaddr) // Writing data     {        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(); // locked }
Operation results and error reporting contents
My solution ideas and tried methods
What I want to achieve



Refer to the answer 1:

FLASH All operations are performed by block or sector

You must erase... Before writing , Strictly speaking, it should only support writing from 1-->0, If FLASH The value on an address is not all 1, Then the write probability will be wrong

 If you want to keep other values of the sector    1.  from FLASH The contents of a sector or block are read out and stored in RAM 2.  Put the value you want to write directly in `1 Read out in step `RAM Revision in China  3.  erase FLASH 4.  It will be revised RAM The entire data in is written to FLASH in 



Refer to the answer 2:

copyright notice
author[CSDN Q & A],Please bring the original link to reprint, thank you.
https://en.cdmana.com/2022/01/202201270358319361.html

Random recommended