2012-01-22 45 views
2

我在STM32微处理器的闪存中实现了一个仿真的EEPROM,主要基于ST的应用笔记(AN2594 - STM32F10x微控制器中的EEPROM仿真)。在STM32上写入闪存

那里和各自的数据表和编程手册(PM0075)中的基本概述非常清晰。但是,我不确定电源输出/系统复位对闪存编程和页面擦除操作的影响。 AppNote也考虑了这种情况,但没有说明编程(写入)操作中断时发生了什么:

  1. 该地址是否具有任意(随机)值? OR
  2. 只写入了一部分位?或
  3. 它是否具有默认擦除值0xFF

感谢提示或指向相关文档。

Arne

+1

我没有提及支持我,但我认为如果在写入或擦除操作已经开始并且在操作完成之前发生停电,那么您不能依靠该位置(或页面)的任何特定状态。 –

+0

由作者迁移到Electrical Engineering StackExchange站点。http://electronics.stackexchange.com/questions/25501/writing-flash-on-stm32 – Potatoswatter

回答

7

这不是一个真正的软件问题(更不用说C++)。它属于electronics.se,但似乎没有办法将问题迁移到那里......仅限于诸如超级用户或webmasters.se之类的网站。

简而言之,硬件本质上是不可靠的。理论上总是会出现中断写入过程或导致写入错误位的问题。

长时间的答案是闪光电路通常是为最大可靠性而设计的。写入时的突然断电可能不会导致损坏,因为驱动器电路可能具有足够的电容或在低电压条件下运行足够长的时间以根据需要完成充电。擦除时的功率损耗可能会更棘手。你真的需要咨询制造商。

对于没有电力中断的“软”系统复位,如果硬件并不总是完全擦除正在处理的任何字节,那将是非常令人惊讶的。通常按预定义的顺序擦除字节,因此您可以使用第一个或最后一个来指示页面是满的还是空的。

+0

你可能是对的。我将这个问题转移到了electronics.se – Arne

0

如果您使用EEProm仿真驱动程序,则不应过分担心闪存损坏问题,因为EEProm仿真驱动程序始终在另一个页面中保留卷影副本。最糟糕的是,你将失去正在写入闪存的最新值。如果仔细观察仿真驱动程序,您会注意到它只是标准外设库中stm32fxx_flash.c的基本封装。 如果您查看应用笔记,您将看到模拟库用于闪存操作的时间。擦除一个页面通常需要最长的时间(M0内核的几十毫秒 - 这取决于时钟频率)。

0

如果您使用的是EEProm仿真驱动程序,您可以添加一个函数,例如在写入完成后检查数据。 例如,如果您有10个要保存的数据,则需要写入11个字节才能闪存。最后一个字节是校验和。并从闪存读取后检查数据。

0
#include "stm32f10x.h" 
#define FLASH_KEY1  ((uint32_t)0x45670123) 
#define FLASH_KEY2  ((uint32_t)0xCDEF89AB) 
#define Page_127  0x0801FC00 
uint16_t i; 
int main() 
{ 
    //FLASH_Unlock 
    FLASH->KEYR = FLASH_KEY1; 
    FLASH->KEYR = FLASH_KEY2; 
    //FLASH_Erase Page 
    while((FLASH->SR&FLASH_SR_BSY)); 
    FLASH->CR |= FLASH_CR_PER; //Page Erase Set 
    FLASH->AR = Page_127; //Page Address 
    FLASH->CR |= FLASH_CR_STRT; //Start Page Erase 
    while((FLASH->SR&FLASH_SR_BSY)); 
    FLASH->CR &= ~FLASH_CR_PER; //Page Erase Clear 
    //FLASH_Program HalfWord 
    FLASH->CR |= FLASH_CR_PG; 
    for(i=0; i<1024; i+=2) 
    { 
    while((FLASH->SR&FLASH_SR_BSY)); 
    *(__IO uint16_t*)(Page_127 + i) = i; 
    } 
    FLASH->CR &= ~FLASH_CR_PG; 
    FLASH->CR |= FLASH_CR_LOCK; 
    while(1); 
}