I want to write to flash Sector 11 of STM32F407VGT from my user code to store some data. I have used the stm32f4xx_hal_flash.c
library. I first erase the sector using this code:
void Flash_Init(void)
{
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.Banks = FLASH_BANK_1;
pEraseInit.NbSectors = 1;
pEraseInit.Sector = FLASH_SECTOR_10;
pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
if(HAL_FLASH_Unlock() == HAL_OK)
{
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
HAL_FLASHEx_Erase(&pEraseInit,0);
HAL_FLASH_Lock();
}
}
The program hangs when it reaches the HAL_FLASHEx_Erase(&pEraseInit,0);
function. My scatter file looks like this:
LR_IROM1 0x08000000 0x01000000 { ; load region size_region
ER_IROM1 0x08000000 0x01000000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (+RW +ZI)
}
}
Is there something I must do first to allow this function to work?
hangs
mean? Does the datasheet mention any precautions when erasing flash? – ChitkaraHAL_FLASH_Lock();
never executes. From the debugger I can see that this area of memory is being erased (all F's) when it is called but the next function isn't called. I can't see anything in the data sheet or .c file that would prevent this function from executing. The flash control register access has to be unlocked before any operation but the program manages that sucessfully. I was thinking that my scatter file isn't properly configured but other than that I am not sure? – Afrit