Skip to main content
SSRIN.1
Associate III
September 2, 2021
Solved

How to calculate the end address of flash memory, given starting address and number of words?

  • September 2, 2021
  • 1 reply
  • 2551 views

I am currently experimenting with programming flash memory. I want to figure out how many sectors to erase before writing data into memory. I came across the following snippet

uint32_t Flash_Write_Data (uint32_t StartSectorAddress, uint32_t *Data, uint16_t numberofwords)
{
 
	static FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t SECTORError;
	int sofar=0;
 
 
	 /* Unlock the Flash to enable the flash control register access *************/
	 HAL_FLASH_Unlock();
 
	 /* Erase the user Flash area */
 
	 /* Get the number of sector to erase from 1st sector */
 
	 uint32_t StartSector = GetSector(StartSectorAddress);
	 uint32_t EndSectorAddress = StartSectorAddress + numberofwords*4;
	 uint32_t EndSector = GetSector(EndSectorAddress);
 
	 /* Fill EraseInit structure*/
	 EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
	 EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
	 EraseInitStruct.Sector = StartSector;
	 EraseInitStruct.NbSectors = (EndSector - StartSector) + 1;
 
	 /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
	 you have to make sure that these data are rewritten before they are accessed during code
	 execution. If this cannot be done safely, it is recommended to flush the caches by setting the
	 DCRST and ICRST bits in the FLASH_CR register. */
	 if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
	 {
		 return HAL_FLASH_GetError ();
	 }
 
	 /* Program the user Flash area word by word
	 (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
 
	 while (sofar<numberofwords)
	 {
	 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, StartSectorAddress, Data[sofar]) == HAL_OK)
	 {
	 	 StartSectorAddress += 4; // use StartPageAddress += 2 for half word and 8 for double word
	 	 sofar++;
	 }
	 else
	 {
	 /* Error occurred while writing data in Flash memory*/
	 	 return HAL_FLASH_GetError ();
	 }
	 }
 
	 /* Lock the Flash to disable the flash control register access (recommended
	 to protect the FLASH memory against possible unwanted operation) *********/
	 HAL_FLASH_Lock();
 
	 return 0;
}

Here end sector calculation is done by adding the product of numberofwords and 4 to start address. Can some one explain the intuition behind this ?

This topic has been closed for replies.
Best answer by TDK

On the STM32, the length of a word is 32 bits, which is 4 bytes.

1 reply

TDK
TDKBest answer
September 2, 2021

On the STM32, the length of a word is 32 bits, which is 4 bytes.

"If you feel a post has answered your question, please click ""Accept as Solution""."
SSRIN.1
SSRIN.1Author
Associate III
September 2, 2021

so each address holds a byte of data correct?

TDK
September 2, 2021
Yes. A word is spread out over 4 bytes.
"If you feel a post has answered your question, please click ""Accept as Solution""."