Запись Flash на STM32 - PullRequest
       27

Запись Flash на STM32

3 голосов
/ 23 января 2012

Я внедряю эмулируемую EEPROM во флэш-памяти на микропроцессоре STM32, в основном на основе Замечания по применению от ST (AN2594 - Эмуляция EEPROM в микроконтроллерах STM32F10x).

Основные сведения приведены там и в соответствующей спецификациии руководство по программированию (PM0075) вполне понятно.Тем не менее, я не уверен относительно последствий отключения питания / сброса системы для программирования флэш-памяти и операций удаления страницы.AppNote также рассматривает этот случай, но не разъясняет, что именно происходит, когда операции программирования (записи) прерываются:

  1. Имеет ли адрес произвольное (случайное) значение?ИЛИ
  2. Является ли написана только часть битов?ИЛИ
  3. Имеет ли оно значение стирания по умолчанию 0xFF?

Спасибо за подсказки или ссылки на соответствующую документацию.

Arne

Ответы [ 4 ]

7 голосов
/ 23 января 2012

На самом деле это не программный вопрос (гораздо меньше C ++). Он принадлежит electronics.se , но, похоже, нет возможности перенести вопросы туда ... только на такие сайты, как superuser или webmasters.se.

Короткий ответ: аппаратное обеспечение ненадежно. В теории всегда что-то может пойти не так, что прерывает процесс записи или приводит к записи неправильного бита.

Длинный ответ заключается в том, что схемы Flash обычно рассчитаны на максимальную надежность. Внезапная потеря мощности при записи, вероятно, не приведет к повреждению, потому что схема драйвера может иметь достаточную емкость или способность работать в условиях низкого напряжения достаточно долго, чтобы закончить разрядку заряда по мере необходимости. Потеря мощности при стирании может быть сложнее. Вам действительно нужно проконсультироваться с производителем.

Для «мягкого» сброса системы без прерывания питания было бы довольно удивительно, если бы аппаратное обеспечение не всегда полностью удаляло те байты, с которыми оно немедленно работало. Обычно байты стираются в предопределенном порядке, поэтому вы можете использовать первый или последний, чтобы указать, является ли страница заполненной или пустой.

3 голосов
/ 13 марта 2016
#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);
}
1 голос
/ 15 мая 2015

Если вы используете драйвер эмуляции EEProm, вам не следует слишком беспокоиться о проблемах повреждения флэш-памяти, поскольку драйвер эмуляции EEProm всегда сохраняет теневую копию на другой странице.В худшем случае вы потеряете самые последние значения, записываемые во флэш-память.Если вы внимательно посмотрите на драйвер эмуляции, вы заметите, что это всего лишь оболочка для stm32fxx_flash.c в стандартной периферийной библиотеке.Если вы посмотрите на примечание к приложению, вы увидите, сколько времени потребуется библиотеке эмуляции для операций флэш-памяти.Стирание страницы обычно занимает больше всего времени (десятки миллисекунд на ядре M0 - это зависит от тактовой частоты).

0 голосов
/ 14 декабря 2015

Если вы используете драйвер эмуляции EEProm, вам лучше добавить такую ​​функцию, как проверка данных после завершения записи.Например, если у вас есть 10 данных для сохранения, вам нужно записать 11 байтов для прошивки.Последний байт является контрольной суммой.И проверьте данные после чтения с флешки.

...