2020-11-05 03:14 AM
Hi all,
I'm using STM32f405 and i want to program FLASH using STM32CubeIDE.
My testing code is the following:
uint32_t base = 0x080E0000; //FLASH SECTOR 11
uint64_t data= 0x55;
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t Error;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.Sector = FLASH_SECTOR_11;
EraseInitStruct.NbSectors = 1;
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase(&EraseInitStruct, &Error);
HAL_FLASH_Lock();
HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, base, data);
HAL_FLASH_Lock();
In HAL_FLASH_Program
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);
}
the second istance of FLASH_WaitForLastOperation at line 38 generates error code 10 ->Write protection error.
I forgot something?