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

 
 
> 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
 
Start new topic
Ответов
andrewlekar
сообщение Nov 8 2010, 11:18
Сообщение #2


Знающий
****

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



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


Участник
*

Группа: Участник
Сообщений: 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



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

 


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


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