Цитата(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();
};