2025-02-14 01:36 AM
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);
}
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.
Could you please help me debug this issue? Any guidance on potential misconfigurations, cache handling, or memory alignment would be appreciated.
Thanks,
Mehul