Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1768 eeprom
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
andrewlekar
Поделитесь, пожалуйста, кодом/советами по организации области eeprom в армах наподобие eeprom в аврках. Я так понимаю, что для записи во флэш как в eeprom нужно выделить там линкером участок памяти, перед записью отключить прерывания, а сам код записи выполнять из ОЗУ. Всё верно? Хотелось бы получить на руки сразу код, так как задача, видимо, достаточно типовая.
Alekseeey
Решал задачу использования флеш как еепром для lpc1114 (cortex m0). Задача решена успешно.
Код совсем не обязательно исполнять из озу. Для записи используются подпрограммы вшитые производителем в ром. Примеры вызовов были в datasheet. Прерывания отключать нужно.
В общем, если интересно (в названии темы фигурирует другой контроллер), то могу выложить свой код.
andrewlekar
Ну если больше никто с этим процессором не появится, то можно и ваш код приспособить.
mempfis_
Цитата(andrewlekar @ Nov 8 2010, 12:59) *
Поделитесь, пожалуйста, кодом/советами по организации области eeprom в армах наподобие eeprom в аврках. Я так понимаю, что для записи во флэш как в eeprom нужно выделить там линкером участок памяти, перед записью отключить прерывания, а сам код записи выполнять из ОЗУ. Всё верно? Хотелось бы получить на руки сразу код, так как задача, видимо, достаточно типовая.


Ищите по ключевому слову IAP.

Сейчас тренируюусь с кодом скаченным из инета на процессоре LPC2368.
С первой попытки записать/считать сектор получилось успешно.
При записи/стирании запрещаю прерывания. Также необходимо подготавливать flash перед каждой операцией стирания/записи и отрезать от sram последние 32 байта оперативки для работы бутлоадера.
Для уточнения смотрите раздел IAP в документации конкретно на Ваш процессор.

P.S. По сравнению с eeprom ресурс flash намного меньше будет. И стирать получится только секторами. Не проще поставить внешнюю serial eeprom типа at24xx.
andrewlekar
Всем спасибо, буду разбираться с кодом. Конечно, размер сектора в 32К не очень приятно - придётся регулярно затирать такой массив данных и держать копию на случай резета...
mempfis_
Цитата(andrewlekar @ Nov 8 2010, 16:54) *
Всем спасибо, буду разбираться с кодом. Конечно, размер сектора в 32К не очень приятно - придётся регулярно затирать такой массив данных и держать копию на случай резета...


У lpc17xx бутлоадер расположен по другому адресу
Код
#define IAP_LOCATION 0x1FFF1FF1

Коды команд и ответы статуса вроде совпадают - но Вы проверьте на всякий случай.
И не все сектора имеют размер 32кBytes. Например 0-9 - 4 kBytes. Можно с помощью линкера зарезервировать какой-нибудь для своих нужд (если 4к хватит).
Alekseeey
Цитата(andrewlekar @ Nov 8 2010, 15:18) *
Ну если больше никто с этим процессором не появится, то можно и ваш код приспособить.



Надеюсь, сойдет в качестве примера.

Организация такая: в озу лежит массив sr (примерно 500 байт), который полностью переписывается в флеш процедурой eeprom_write(). При старте этот массив, соответствено, загружается из флеш.

В линкерном скрипте я зарезервировал 32 байта верхних адресов ОЗУ и страницу 4 килобайта флеш.


Код
#include "LPC11xx.h"

#include "_vars.h"

/* This data must be global so it is not read from the stack */
typedef void (*IAP)( uint32_t[], uint32_t[]); // Обьявляем тип -- указатель на функцию, у которой
                                              // есть два параметра. Это будет пустая,
                                              // бестиповая функция.
IAP iap_entry;              // Устанавливаем указатель на функцию
static uint32_t command[6]; // А это два массива -- с параметрами и результатами
static uint32_t result[5];


// Адрес начала флеш, которая используется как еепром
#define FLASH_EEPROM_START_ADDRESS   (0x00007000)



// Тупое переписывание из флеш в озу
void eeprom_load(uint32_t size)
{
  unsigned char * src;
  unsigned char * dest;

  src  = (unsigned char *)FLASH_EEPROM_START_ADDRESS;
  dest = (unsigned char *)&sr;

  while (size)
  {
    *dest++ = *src++;
    size--;
  };

};


// Функция подготовки флеш
uint32_t eeprom_prepare_flash(void)
{
  // Устанавливаем указатель на подпрограмму работы с еепром
  iap_entry = (IAP)0x1fff1ff1;
  command[0] = 50;            // Команда 50 - подготовка сектора
  command[1] = 7;             // Начальный сектор
  command[2] = 7;             // Конечный сектор
  iap_entry(command, result);
  return result[0];
};

// Функция очистки флеш
uint32_t eeprom_clear_flash(void)
{
  // Устанавливаем указатель на подпрограмму работы с еепром
  iap_entry = (IAP)0x1fff1ff1;
  command[0] = 52;                  // Команда 52 - стирание сектора
  command[1] = 7;                   // Начальный сектор
  command[2] = 7;                   // Конечный сектор
  command[3] = system_clock / 1000; // Частота CCLK в килогерцах
  iap_entry(command, result);
  return result[0];
};

// Функция записи флеш
uint32_t eeprom_write_flash(void)
{
  // Устанавливаем указатель на подпрограмму работы с еепром
  iap_entry = (IAP)0x1fff1ff1;
  command[0] = 51;                  // Команда 51 - запись из рам в флеш
  command[1] = FLASH_EEPROM_START_ADDRESS;          // Адрес во флеш (должен быть кратен 256)
  command[2] = (uint32_t)(&sr);     // Адрес в рам (должен быть кратен word)
  command[3] = 1024;                // Количество байт для записи взято из ряда, который дан в даташите
  command[4] = system_clock / 1000; // Частота CCLK в килогерцах
  iap_entry(command, result);
  return result[0];
};



/* Записываем скопом весь массив из озу во флеш */
void eeprom_write(void)
{
  uint32_t e;

  __disable_irq();

  do
  {
    e = eeprom_prepare_flash();
    e |= eeprom_clear_flash();
  } while (e);

  while (eeprom_prepare_flash()) {__NOP(); };

  eeprom_write_flash();

  __enable_irq();
};
andrewlekar
Да, подобный код я и планировал использовать, спасибо. Риск резета во время работы с флэшью буду считать минимальным и восстанавливать флэш по контрольной сумме. Потом можно будет сделать и копию флэша для восстановления, если время будет.
Первые адреса для eeprom использовать очень не хочется, так как будет сложнее записывать основной софт (нужна поддержка перезаписи софта без изменения eeprom).

Вообще, реально стирание 32К флэши даёт заметную задержку? И напомните, сколько было гарантировано циклов записи/стирания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.