Skip to main content
Visitor II
December 13, 2024
Solved

Flash writing

  • December 13, 2024
  • 3 replies
  • 1144 views

Hi All, trying to write data into flash with dynamical flash address selection approach but it fails but at same time if hash(#) define the address the flash programming all works fine, Please suggest me the best solution and explain me the issues choosing dynamical address for flash address.

 
 
/*********************************************************************/
Note: 1. this code where I'm trying to flash using dynamic address approach.
           2. and yes the logic to choose the address working fine I can read the value in target address variable.

 

typedef struct {
uint32_t active_app; // 1 for App1, 2 for App2
uint32_t app1_valid; // 1 if App1 is valid
uint32_t app2_valid; // 1 if App2 is valid
} BootInfo;

#define BOOT_INFO_ADDRESS 0x0802F000

int8_t UpdateFWBlueNRG(uint32_t *SizeOfUpdate,uint8_t * att_data, int32_t data_length)
{
int8_t ReturnValue=0;
 /* Save the Packed received */

 if(data_length>(*SizeOfUpdate)){
 /* Too many bytes...Something wrong... necessity to send it again... */
 // OTA_PRINTF("OTA something wrong data_length=%ld RemSizeOfUpdate=%ld....\r\nPlease Try again\r\n", (long)data_length, (long)(*SizeOfUpdate));
 ReturnValue = -1;
 /* Reset for Restarting again */
 *SizeOfUpdate=0;
 } else {
 uint64_t ValueToWrite;
 int32_t Counter;
 // Clear all flash error flags
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR );
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_FWWERR);
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_NOTZEROERR);

 BootInfo* boot_info = (BootInfo*)BOOT_INFO_ADDRESS;
 uint32_t target_address = (boot_info->active_app == 1) ? 0x0801C000 : 0x08005000; 
 
 /* Save the received OTA packed ad save it to flash */
 /* Unlock the Flash to enable the flash control register access *************/

 HAL_FLASH_Unlock();
 HAL_FLASH_OB_Unlock();
 
 for(Counter=0;Counter<data_length;Counter+=8){
 memcpy((uint8_t*) &ValueToWrite,att_data+Counter,8);
 
 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLE, target_address,ValueToWrite)==HAL_OK){ 
 target_address+=8;
 } else {
 /* Error occurred while writing data in Flash memory.
 User can add here some code to deal with this error
 FLASH_ErrorTypeDef errorcode = HAL_FLASH_GetError(); */
while(1){
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
 HAL_Delay (1000);
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
 HAL_Delay (1000);}
 OTA_ERROR_FUNCTION();
 }
 }
 /* Reduce the remaining bytes for OTA completion */
 *SizeOfUpdate -= data_length;

 if(*SizeOfUpdate==0) {

 /* We had received the whole firmware and we have saved it in Flash */
 OTA_PRINTF("OTA Update saved\r\n");
 NVIC_SystemReset();
 }

 /* Lock the Flash to disable the flash control register access (recommended
 to protect the FLASH memory against possible unwanted operation) *********/
 HAL_FLASH_Lock();
HAL_FLASH_OB_Lock();
 }
 return ReturnValue;
} 
*////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
​

 

Now this code works fine if instead of choosing address dynamically and putting # define Writing_address 0x0801C000

 

#define Writting_addresss 0x0801C000
int8_t UpdateFWBlueNRG(uint32_t *SizeOfUpdate,uint8_t * att_data, int32_t data_length)
{
int8_t ReturnValue=0;
 /* Save the Packed received */

 if (data_length>(*SizeOfUpdate)) {

 /* Too many bytes...Something wrong... necessity to send it again... */
 // OTA_PRINTF("OTA something wrong data_length=%ld RemSizeOfUpdate=%ld....\r\nPlease Try again\r\n", (long)data_length, (long)(*SizeOfUpdate));
 ReturnValue = -1;
 /* Reset for Restarting again */
 *SizeOfUpdate=0;
 }
else {
 uint64_t ValueToWrite;
 int32_t Counter;
 // Clear all flash error flags
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR );
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_FWWERR);
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_NOTZEROERR);

 
 
 /* Save the received OTA packed ad save it to flash */
 /* Unlock the Flash to enable the flash control register access *************/

 HAL_FLASH_Unlock();
 HAL_FLASH_OB_Unlock();
 
 for(Counter=0;Counter<data_length;Counter+=8){
 memcpy((uint8_t*) &ValueToWrite,att_data+Counter,8);
 
 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLE,Writting_addresss,ValueToWrite)==HAL_OK){ 
 Writting_addresss+=8;
 } else {
 /* Error occurred while writing data in Flash memory.
 User can add here some code to deal with this error
 FLASH_ErrorTypeDef errorcode = HAL_FLASH_GetError(); */
while(1){
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
 HAL_Delay (1000);
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
 HAL_Delay (1000);}
 OTA_ERROR_FUNCTION();
 }
 }
 /* Reduce the remaining bytes for OTA completion */
 *SizeOfUpdate -= data_length;

 if(*SizeOfUpdate==0) {

 /* We had received the whole firmware and we have saved it in Flash */
 OTA_PRINTF("OTA Update saved\r\n");
 NVIC_SystemReset();
 }

 /* Lock the Flash to disable the flash control register access (recommended
 to protect the FLASH memory against possible unwanted operation) *********/
 HAL_FLASH_Lock();
HAL_FLASH_OB_Lock();
 }
 return ReturnValue;
} 
​

 

 

    This topic has been closed for replies.
    Best answer by mƎALLEm

    Hello,

    Declare target_address volatile:

    __IO uint32_t target_address

    3 replies

    Super User
    December 13, 2024

    I edited you post to use the proper code tags; please see How to insert source code for future reference.

    See also How to write your question to maximize your chances to find a solution

     


    @satyam9896 wrote:

    trying to write data into flash with dynamical flash address selection approach but it fails


    So how, exactly, does it "fail" ?

    mƎALLEmAnswer
    Technical Moderator
    December 13, 2024

    Hello,

    Declare target_address volatile:

    __IO uint32_t target_address
    Technical Moderator
    December 19, 2024

    @satyam9896 

    As your issue has been solved according to this thread, please close this one by marking the comment that guided you to the solution Accepted as Solution.