dur*_*ill 0 stm32 flash-memory stm32f4discovery
我正在使用STM32F401VCT6U"发现"板,我需要为用户提供一种在运行时在内存中写入地址的方法.
我写了可以简化为以下功能的内容:
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;
}
Run Code Online (Sandbox Code Playgroud)
在上面,address是基址,values是一个至少大小的缓冲区,count它包含要写入内存count的字节和要写入的字节数.
现在,我的问题如下:当address在flash中使用base调用上述函数时count=100,它在前几次正常工作,将传递的values缓冲区写入flash.然而,在那些前几次调用之后,我不能再写任何值了:我只能复位flash中的值中的位,例如,尝试将0xFF写入0x7F将在闪存中留下0x7F,而将0xFE写入0x7F将留下0x7E,并且任何值的0x00都将成功(但之后其他任何值都不会写入该地址).
我仍然可以通过改变基数来正常写入闪存中的其他地址address,但是再次只能写几次(两次或三次调用count=100).
此行为表明已达到闪存的最大写入次数,但我无法想象它会如此之快.在用尽之前,我预计至少有10,000次写入.那么我做错了什么?
您误解了闪存的工作原理 - 例如,它不像写EEPROM那么直接.你要描述的行为对于flash来说是正常的.
要重复写入相同的闪存地址,必须首先使用FLASH_EraseSector擦除整个扇区.通常,在擦除期间需要保留的任何数据都需要缓冲在RAM中或另一个闪存扇区中.
如果你重复编写一小块数据并且担心闪存烧坏需要多次擦除写入周期,你可能需要写一个闪存接口,每次写入你沿着闪存扇区移动你的数据来取消闪存,跟踪它从行业开始的当前偏差.只有当你在扇区中用完字节时才需要擦除并在扇区开始时重新开始.