7
votes

So I can't write to internal flash memory directly after erasing it. If there's no erase operation before write operation, then I can. Any ideas as to why?

Programming function returns 'successful write' value, but when looking at memory, no data is written. Here's the code:

uint32_t pageAddress = 0x08008000;
uint16_t buffer = 0xAAAA;

HAL_FLASH_Unlock();
FLASH_PageErase(pageAddress);
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer);
HAL_FLASH_Lock();

I've tried locking the memory between erasing and programming it, creating a delay between these operations, that doesn't help.

1
Do the flash erase/write calls not return any status/error information?Martin James
@MartinJames 'FLASH_PageErase()' doesn't. 'HAL_FLASH_Program()' does, and it's 'HAL_OK' regardless of whether writing was actually successful or not.andrey
What happens if you just replace HAL_FLASH_Program() by FLASH_Program_HalfWord() ?ElderBug

1 Answers

11
votes

The problem was that PER bit in FLASH->CR register which is set when FLASH_PageErase() is called isn't cleared at the end of it. Clearing this bit while flash is still unlocked allows other operations on flash to be run after that.

STM documentation has nothing to say about this.