我使用flash来保存数据,但有时候在擦除Flash时会发生错误,我不明白为什么?
感谢您的帮助!抱歉我的英文
我的程序大小:30,46千字节。
这是我的功能:
#define FLASH_PAGE_ADDR 0x08010000
uint16_t Mydata = 2345;
void WriteData(void)
{
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR\
|FLASH_FLAG_WRPRTERR);
FLASH_ErasePage(FLASH_PAGE_ADDR);
FLASH_ProgramHalfWord(FLASH_PAGE_ADDR+2, Mydata);
}
答案 0 :(得分:1)
你的芯片有64kB的闪存,所以试图擦除一个不存在的页面(闪存启动后启动64kB)并不是最好的选择。尝试这样做也可以删除闪存的 FIRST 页面,删除中断向量和部分正在运行的应用程序。
答案 1 :(得分:-1)
设备stm32F103C8T8包含64Kb闪存。
内存布局如下:
对于您的设备,闪存实际上是 0x08000000-0x0800FFFF ,因为您有64Kb变体。该内存将是我们的第一个页面(又名扇区)的闪存。您的设备有64页,每页大小为1Kb。您只能删除整页。有关闪存模块组织的信息,请参见下图:
在您的示例中,您告诉设备开始从 0x08010000 中删除。根据上面给出的信息,这当然是不可能的(因为这个位置没有内存)。我建议您更改位置,使其定位到有效页面(盯着页面的开头):
#define FLASH_PAGE_4_ADDR 0x08001000
确保在删除时没有从那个位置执行,从那时起,当然,你的程序会崩溃。
另外,请考虑查看用于擦除的函数的返回值。他们可以告诉你一些重要的事情。