Skip to main content
SGasp.1
Associate III
October 4, 2021
Question

STM32F401 HAL_FLASH_Program not working

Hi community..

I have the following code :

bool FLASH_WriteDoubleWord(uint32_t flashAddress, uint64_t Data)
{
 
	FLASH_Unlock();
	/*clear some flag*/
	 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
 
	//FLASH_Erase_Sector(2, 2);
	 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
 
	/* Program the user Flash area word by word */
	if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)&flashAddress, Data) != HAL_OK)
	{
		FLASH_Lock();
		return false;
	}
 
	FLASH_Lock();
 
	return true;
}

where

static uint32_t address_test = 0x08008000;
static uint64_t data_test = 0xAAAAAAAA;

I don't understand why the erase part is working instead HAL_FLASH_Program it is not writing the data in the expected address.

Can you please tell me why in your opinion?

Thanks a lot.

Simone

This topic has been closed for replies.

14 replies

ST Technical Moderator
October 4, 2021

Hello @SGasp.1​ ,

The reference manual says:  

The write access type (byte, half-word, word or double word) must correspond to the type of parallelism chosen (x8, x16, x32 or x64).

If not, the write operation is not performed and a program parallelism error flag (PGPERR) is set in the FLASH_SR register.

So, check if there is an error with the FLASH_SR register prior to calling HAL_FLASHEx_Erase.

Hope my answer helped you! and please keep us informed about your progress on this issue.

When your question is answered, please close this topic by choosing Select as Best. This will help other users find that answer faster.

Imen

In order to give better visibility on the answered topics, please click on 'Best answer' on the reply which solved your issue or answered your question. Thanks
TDK
October 4, 2021

FLASH_Erase_Sector is not meant to be called directly. Use HAL_FLASHEx_Erase instead.

"If you feel a post has answered your question, please click ""Accept as Solution""."
SGasp.1
SGasp.1Author
Associate III
October 5, 2021

Hi TDK ... the instruction that is not working it is the following ..

HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)&flashAddress, Data) != HAL_OK)

Tesla DeLorean
Guru
October 5, 2021

Don't want the address of parameter variable. Need to pass the address as a uint32_t

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
SGasp.1
SGasp.1Author
Associate III
October 5, 2021

Can you provide a working example Tesla ?

Thanks a lot .

This is the function that I am calling

 * @brief Program byte, halfword, word or double word at a specified address
 * @param TypeProgram Indicate the way to program at a specified address.
 * This parameter can be a value of @ref FLASH_Type_Program
 * @param Address specifies the address to be programmed.
 * @param Data specifies the data to be programmed
 * 
 * @retval HAL_StatusTypeDef HAL Status
 */
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
{
 HAL_StatusTypeDef status = HAL_ERROR;
 
 /* Process Locked */
 __HAL_LOCK(&pFlash);
 
 /* Check the parameters */
 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
 
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
 
 if(status == HAL_OK)
 {
 if(TypeProgram == FLASH_TYPEPROGRAM_BYTE)
 {
 /*Program byte (8-bit) at a specified address.*/
 FLASH_Program_Byte(Address, (uint8_t) Data);
 }
 else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD)
 {
 /*Program halfword (16-bit) at a specified address.*/
 FLASH_Program_HalfWord(Address, (uint16_t) Data);
 }
 else if(TypeProgram == FLASH_TYPEPROGRAM_WORD)
 {
 /*Program word (32-bit) at a specified address.*/
 FLASH_Program_Word(Address, (uint32_t) Data);
 }
 else
 {
 /*Program double word (64-bit) at a specified address.*/
 FLASH_Program_DoubleWord(Address, Data);
 }
 
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
 
 /* If the program operation is completed, disable the PG Bit */
 FLASH->CR &= (~FLASH_CR_PG); 
 }
 
 /* Process Unlocked */
 __HAL_UNLOCK(&pFlash);
 
 return status;
}

Simone

Tesla DeLorean
Guru
October 5, 2021

Without the ampersand '&'​

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
SGasp.1
SGasp.1Author
Associate III
October 5, 2021

I tried to remove but nothing to do

SGasp.1
SGasp.1Author
Associate III
October 5, 2021

I changed the code in this way ...

uint64_t Data = 1000;
uint32_t 	address_test = 0x08008090;
 
FLASH_WriteDoubleWord(address_test , Data);
 
bool FLASH_WriteDoubleWord(uint32_t flashAddress, uint64_t Data)
{
 
	FLASH_Unlock();
	/*clear some flag*/
 
	FLASH_EraseSectors(2, 1); /*working*/
 
	/* Program the user Flash area word by word */
	if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, flashAddress, Data) != HAL_OK) /*not working*/
	{
		FLASH_Lock();
		return false;
	}
 
	FLASH_Lock();
 
	return true;
}

Nothing to do...

Please help

SGasp.1
SGasp.1Author
Associate III
October 5, 2021

i tried in this way

bool FLASH_WriteDoubleWord(uint32_t flashAddress, uint64_t Data)
{
 
	FLASH_Unlock();
	FLASH_EraseSectors(2, 1); /*working*/
	HAL_Delay(500);
	FLASH_Unlock();
	HAL_Delay(500);
 
	/* Program the user Flash area word by word */
	if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, (uint32_t) flashAddress, Data) != HAL_OK) /*not working*/
	{
 
		Turn_on_red_led();
		FLASH_Lock();
		return false;
	}
 
	FLASH_Lock();
 
	return true;
}

Now I don't get the erro from HAL but when I check the flash the values is not written as expected.

0693W00000FBTNuQAP.png 

Piranha
Principal III
October 5, 2021

Read the relevant sections of a reference manual? RM0368 section 3.5.2 explains your "problem" very clearly.

***Edited by moderation: please refrain from using inflammatory language***

SGasp.1
SGasp.1Author
Associate III
October 5, 2021

Thanks Piranha...  

RM0368 section 3.5.2 explains your "problem" very clearly...

Can you make a recap about what this point is saying?

Thanks a lot

Piranha
Principal III
October 10, 2021

No, I will not read for you. You have the document and section number - go and read it!