EEPROM и Flash память программ

Views: 2467


(актуально для компилятора XC8 и HI-TECH)


Подготовка данных для EEPROM (стандартные макросы)

Если при программировании контроллера необходимо предварительно записать данные в EEPROM, то можно воспользоваться следующим макросом

__EEPROM_DATA (0,1,2,3,4,5,6,7);// инициализация EEPROM

Макрос позволяет инициализировать блок в 8 байт. Если необходимо инициализация большего количества данных можно использовать несколько макросов. Пример,

__EEPROM_DATA (0,1,2,3,4,5,6,7);// инициализация EEPROM
__EEPROM_DATA (33,48,2,3,4,5,6,7);// инициализация EEPROM
__EEPROM_DATA (0,1,2,3,77,5,6,33);// инициализация EEPROM

Каждый следующий макрос инициализирует следующее 8 байт.



Запись и чтение из EEPROM памяти (стандартные макросы и функции)

Макросы записи чтения из EEPROM

EEPROM_WRITE(address,value); и variable=EEPROM_READ(address);

но необходимо обратить внимание макрос для чтения не проверяет, закончилось ли запись EEPROM. Если после записи сразу сделать чтение из этой ячейки результат будет не предсказуем.

#include <htc.h>

void eetest(void)
{
   unsigned char value = 1;
   unsigned char address = 0;
// инициализация записи
   EEPROM_WRITE(address,value);       //макрос не ожидает окончание записи в память
// организация ожидания окончания записи для  EEPROM_READ
   while(WR) continue;
// чтение EEPROM из адреса
   value = EEPROM_READ(address);
}

Функции записи чтения из EEPROM

variable=eeprom_read(address) и eeprom_write(address,value)

аналогичный пример записи чтения

#include <htc.h>

void eetest(void)
 {
    unsigned char value = 1;
    unsigned char address = 0;
// запись
    eeprom_write(address, value);// функция ожидает окончание записи в память
// чтение
value = eeprom_read(address);
...

Функции записи массива или последовательная запись данных

Если вы организуете циклическую запись в EEPROM надо учитывать тот факт, что изменять адрес в регистре EEADR можно только после окончания записи. Если это сделать не дождавшись, то запись в регистр адреса EEADR не воспримется устройством (не изменится).

teleaddr=0;

                EEPROM_WRITE(teleaddr,0xdf);
                while (WR) continue;                          //необходимо для изменения адреса
                teleaddr++;                                        //ß
                EEPROM_WRITE(teleaddr,0xdf);
                while (WR) continue;
                teleaddr++;
                EEPROM_WRITE(teleaddr,0x02);
                while (WR) continue;
                teleaddr++;
                EEPROM_WRITE(teleaddr,0x07);
                while (WR) continue;
                teleaddr++;

Если убрать из последовательности ожидание окончания записи while(WR) continue; то все попытки записи будут предприняты только по адресу EEADR=0. Это актуально как для макроса EEPROM_WRITE,  так и для функции eeprom_write.

В принципе, что макрос, что функция это одно и тоже, функция это вызов того же макроса.

НЕЛЬЗЯ использовать регистр EEADR непосредственно с функциями.



Запись и чтение из Flash памяти программ

Возможно при помощи макросов

Записать блок кода/данных в области во флэш-памяти:

flash_write (указатель начала блока данных, длина блока, указатель начала области флэш-памяти);
flash_write(source_pointer, length, dest_pointer);

чтение байта данных из флэш-памяти, и сохранение в переменной:

variable=flash_read (адрес);
variable=flash_read(address);

Поделись этим!