реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC1768 eeprom
andrewlekar
сообщение Nov 8 2010, 09:59
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Поделитесь, пожалуйста, кодом/советами по организации области eeprom в армах наподобие eeprom в аврках. Я так понимаю, что для записи во флэш как в eeprom нужно выделить там линкером участок памяти, перед записью отключить прерывания, а сам код записи выполнять из ОЗУ. Всё верно? Хотелось бы получить на руки сразу код, так как задача, видимо, достаточно типовая.
Go to the top of the page
 
+Quote Post
Alekseeey
сообщение Nov 8 2010, 10:45
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Решал задачу использования флеш как еепром для lpc1114 (cortex m0). Задача решена успешно.
Код совсем не обязательно исполнять из озу. Для записи используются подпрограммы вшитые производителем в ром. Примеры вызовов были в datasheet. Прерывания отключать нужно.
В общем, если интересно (в названии темы фигурирует другой контроллер), то могу выложить свой код.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 8 2010, 11:18
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Ну если больше никто с этим процессором не появится, то можно и ваш код приспособить.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 8 2010, 11:43
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(andrewlekar @ Nov 8 2010, 12:59) *
Поделитесь, пожалуйста, кодом/советами по организации области eeprom в армах наподобие eeprom в аврках. Я так понимаю, что для записи во флэш как в eeprom нужно выделить там линкером участок памяти, перед записью отключить прерывания, а сам код записи выполнять из ОЗУ. Всё верно? Хотелось бы получить на руки сразу код, так как задача, видимо, достаточно типовая.


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

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

P.S. По сравнению с eeprom ресурс flash намного меньше будет. И стирать получится только секторами. Не проще поставить внешнюю serial eeprom типа at24xx.

Сообщение отредактировал mempfis_ - Nov 8 2010, 11:44
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 8 2010, 12:54
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Всем спасибо, буду разбираться с кодом. Конечно, размер сектора в 32К не очень приятно - придётся регулярно затирать такой массив данных и держать копию на случай резета...
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 8 2010, 13:07
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(andrewlekar @ Nov 8 2010, 16:54) *
Всем спасибо, буду разбираться с кодом. Конечно, размер сектора в 32К не очень приятно - придётся регулярно затирать такой массив данных и держать копию на случай резета...


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

Коды команд и ответы статуса вроде совпадают - но Вы проверьте на всякий случай.
И не все сектора имеют размер 32кBytes. Например 0-9 - 4 kBytes. Можно с помощью линкера зарезервировать какой-нибудь для своих нужд (если 4к хватит).
Go to the top of the page
 
+Quote Post
Alekseeey
сообщение Nov 8 2010, 13:32
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Цитата(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();
};
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 8 2010, 18:23
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



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

Вообще, реально стирание 32К флэши даёт заметную задержку? И напомните, сколько было гарантировано циклов записи/стирания.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016