I'm using a STM32F401VCT6U "discovery" board, and I need to provide a way for the user to write addresses in memory at runtime.
I wrote what can be simplified to the following function:
uint8_t Write(uint32_t address, uint8_t* values, uint8_t count)
{
uint8_t index;
for (index = 0; index < count; ++index) {
if (IS_FLASH_ADDRESS(address+index)) {
/* flash write */
FLASH_Unlock();
if (FLASH_ProgramByte(address+index, values[index]) != FLASH_COMPLETE) {
return FLASH_ERROR;
}
FLASH_Lock();
} else {
/* ram write */
((uint8_t*)address)[index] = values[index]
}
}
return NO_ERROR;
}
In the above, address
is the base address, values
is a buffer of size at least count
which contains the bytes to write to memory and count
the number of bytes to write.
Now, my problem is the following: when the above function is called with a base address
in flash and count=100
, it works normally the first few times, writing the passed values
buffer to flash. After those first few calls however, I cannot write just any value anymore: I can only reset bits in the values in flash, eg an attempt to write 0xFF to 0x7F will leave 0x7F in the flash, while writing 0xFE to 0x7F will leave 0x7E, and 0x00 to any value will be successful (but no other value will be writable to the address afterwards).
I can still write normally to other addresses in the flash by changing the base address
, but again only a few times (two or three calls with count=100
).
This behaviour suggests that the maximum write count of the flash has been reached, but I cannot imagine it can be so fast. I'd expect at the very least 10,000 writes before exhaustion. So what am I doing wrong?
if/else
outside thefor
loop to begin with!!! As far as I can tell, you can also unlock/lock the flash outside thefor
loop. – barak manosFLASH_ProgramByte
(e.g.,FLASH_ProgramChunk
). For the RAM, an additional improvement would be to write 4 bytes at a time, but you'll have to split the loop in order to avoid alignment issues. – barak manos