cancel
Showing results for 
Search instead for 
Did you mean: 

Issue with Flash Read/Write on STM32H7S78-DK Board

Mehulrana511
Associate III

Hi,

I am working with the STM32H7S78-DK board and trying to implement Flash read/write functionality in my project (Touchgfx). I have allocated 64KB of Flash for user storage with the following memory mapping:
please review the STM32H7S7L8HXH_RAMxspi1_ROMxspi2.ld file,

 

 

MEMORY
{
  RAM       (rw)  : ORIGIN = 0x24000000, LENGTH = 0x0006e000
  RAM_CMD   (rw)  : ORIGIN = 0x2406e000, LENGTH = 0x00004000

  ITCM      (rw)  : ORIGIN = 0x00000000, LENGTH = 0x00010000
  DTCM      (rw)  : ORIGIN = 0x20000000, LENGTH = 0x00003000
  DTCM_RTOS (rw)  : ORIGIN = 0x20003000, LENGTH = 0x0000D000
  SRAMAHB   (rw)  : ORIGIN = 0x30000000, LENGTH = 0x00008000
  BKPSRAM   (rw)  : ORIGIN = 0x38800000, LENGTH = 0x00001000

  FLASH     (xr)  : ORIGIN = 0x70000000, LENGTH = 0x001F0000 /* Reduced size */
  FLASH_USER (rw) : ORIGIN = 0x701F0000, LENGTH = 0x00010000 /* Last 64KB for user storage */
  FLASH_GFX (r)   : ORIGIN = 0x70200000, LENGTH = 0x07E00000
  EXTRAM    (rw)  : ORIGIN = 0x90000000, LENGTH = 0x02000000
 
}

SECTIONS
{  
  /* User storage memory at the end of Flash */
  .user_storage (NOLOAD) :
  {
    . = ALIGN(4);
    _user_storage_start = .;
    KEEP(*(.user_storage*)) /* User-defined flash storage section */
    . = ALIGN(4);
    _user_storage_end = .;
  } >FLASH_USER
}

 

 

 

Below is my code for handling Flash read and write operations:

 

 

#define FLASH_USER_START_ADDR  ((uint32_t)0x701F0000)
#define FLASH_USER_END_ADDR    ((uint32_t)0x701FFFFF)


typedef struct
{
	uint32_t  name;
	uint32_t  model;
    uint32_t firmware_version;
} FH_FLASH_DATA_INFO;


uint32_t FH_FlashWriteData(uint32_t StartAddress, FH_FLASH_DATA_INFO *data)
{
    FLASH_EraseInitTypeDef EraseInitStruct;
    uint32_t SECTORError;
    uint32_t *data_ptr = (uint32_t *)data;
    uint16_t numberofwords = sizeof(FH_FLASH_DATA_INFO) / 4;

    printf("Unlocking Flash...\n");

    HAL_FLASH_Unlock();

    // Erase the flash sector before writing
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
    EraseInitStruct.Sector = FLASH_SECTOR_NB;
    EraseInitStruct.NbSectors = 1;

    if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
    {
    	printf("Flash Erase Failed! Error: %d\n",(int) HAL_FLASH_GetError());
        HAL_FLASH_Lock();
        return HAL_FLASH_GetError();
    }

    printf("Writing Data to Flash...\n");
    // Write structure to Flash, word by word
    for (uint16_t i = 0; i < numberofwords; i++)
    {
    	printf("Writing Word %d: 0x%08X\n", i, (unsigned int)data_ptr[i]); // Print before write

        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, StartAddress + (i * 4), data_ptr[i]) != HAL_OK)
        {
        	 printf("Flash Write Failed at word %d! Error: %d\n", i,(int) HAL_FLASH_GetError());
            HAL_FLASH_Lock();
            return HAL_FLASH_GetError();
        }
    }

    printf("Flash Write Successful!\n");
    // Lock the Flash after writing
    HAL_FLASH_Lock();

    return 0; // Success
}


void FH_FlashReadData(uint32_t StartAddress, FH_FLASH_DATA_INFO *data)
{
	printf("Reading Data from Flash...\n");

    uint32_t *data_ptr = (uint32_t *)data;
    uint16_t numberofwords = sizeof(FH_FLASH_DATA_INFO) / 4;

    for (uint16_t i = 0; i < numberofwords; i++)
    {
        data_ptr[i] = *(__IO uint32_t *)(StartAddress + (i * 4));
        printf("Read Word %d: 0x%08X\n", i, (unsigned int)data_ptr[i]);
    }
}

void FH_InitFlashDataHandler(void)
{
	printf("Read Flash Data:\n");

	FH_FLASH_DATA_INFO flash_data_write =
	{
	    .name = 1,
	    .model = 5,
	    .firmware_version = 0x01020304,
	};

	FH_FLASH_DATA_INFO flash_data_read;

	// Writing Data to Flash
	FH_FlashWriteData(FLASH_USER_START_ADDR, &flash_data_write);

	// Reading Data from Flash
	FH_FlashReadData(FLASH_USER_START_ADDR, &flash_data_read);

	// Print the read values
	printf("Name: %d\n",(int) flash_data_read.name);
	printf("Model: %d\n",(int) flash_data_read.model);
	printf("Firmware Version: 0x%08X\n",(unsigned int) 
              flash_data_read.firmware_version);
}

 

 


Issue Faced

When I execute the flash write function, the program gets stuck after writing the data. (No error print during write operation) but The "Flash Write Successful!" message is never printed, and I am unable to verify the written data.
Note: My code was working perfectly before adding the Flash read/write functionality. However, after integrating it, the whole code is stuck.

Mehulrana511_0-1739525642655.png

 

Could you please help me debug this issue? Any guidance on potential misconfigurations, cache handling, or memory alignment would be appreciated.

Thanks,
Mehul

0 REPLIES 0