在STM32上编写Flash

时间:2012-01-22 23:30:59

标签: c microcontroller stm32

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

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

  1. 地址是否具有任意(随机)值? OR
  2. 只写了部分位吗?或者
  3. 是否具有默认的擦除值0xFF
  4. 感谢您提供相关文档的提示或指示。

    ·阿尔

4 个答案:

答案 0 :(得分:7)

这不是一个真正的软件问题(更不用说C ++)了。它属于electronics.se,但似乎没有选项可以将问题迁移到那里......仅限于超级用户或webmasters.se等网站。

简短的回答是,硬件本质上是不可靠的。理论上总是会出现错误,这会中断写入过程或导致写入错误的位。

长期以来,闪存电路通常是为了最大可靠性而设计的。写入时突然断电可能不会导致损坏,因为驱动器电路可能具有足够的电容或能够在低电压条件下工作足够长以在必要时完成电荷耗尽。擦除时的功率损耗可能比较棘手。你真的需要咨询制造商。

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

答案 1 :(得分:2)

#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);
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您正在使用EEProm Emulation驱动程序,那么您可以添加一个函数,例如在写完后检查数据。 例如,如果要保存10个数据,则需要将11个字节写入闪存。最后一个字节是校验和。从闪存中读取后检查数据。