在STM32上写Flash

Posted

技术标签:

【中文标题】在STM32上写Flash【英文标题】:Writing Flash on STM32 【发布时间】:2012-02-16 10:51:03 【问题描述】:

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

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

    地址是否有任意(随机)值?或 是否只写入了部分位?或者 是否有默认擦除值0xFF

感谢相关文档的提示或指针。

阿恩

【问题讨论】:

我没有支持我的参考,但我认为如果在写入或擦除操作开始之后和操作完成之前发生断电,那么你不能依赖于位置(或页面)的任何特定状态。 作者迁移到电气工程 StackExchange 站点。 electronics.stackexchange.com/questions/25501/… 【参考方案1】:

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

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

答案很长,闪存电路通常是为实现最高可靠性而设计的。写入时突然断电可能不会导致损坏,因为驱动电路可能有足够的电容或在低电压条件下运行足够长的时间以完成必要的电荷耗尽。擦除时的功率损失可能更棘手。您确实需要咨询制造商。

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

【讨论】:

你可能是对的。我将问题迁移到了electronics.se【参考方案2】:

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

【讨论】:

【参考方案3】:

如果您使用的是EEProm Emulation驱动程序,您最好添加一个功能,例如写入完成后检查数据。 例如,如果您有 10 个数据要保存,那么您需要将 11 个字节写入闪存。最后一个字节是校验和。并检查从闪存读取后的数据。

【讨论】:

【参考方案4】:
#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);

【讨论】:

以上是关于在STM32上写Flash的主要内容,如果未能解决你的问题,请参考以下文章

STM32cubemx-HAL库串口断线问题

于 STM32 的 IAP 总结

iar 怎么将flash的固定地址用固定变量占住

stm32启动文件在哪个目录

怎么在ubuntu下开发stm32

stm32中的堆栈地址在哪里定义的