Микроконтроллеры AVR, как и многие другие MCU с Гарвардской архитектурой, имеют некоторое количество памяти EEPROM (Electronically Erasable Read-Only Memory, электрически стираемая память, работающая только на чтение). Этот тип памяти позволяет разработчику сохранять в памяти EEPROM различные параметры программы, константы, строки меню, выводимые на индикатор LCD, и т. п. Память EEPROM выгоднее для этих целей, чем память FLASH, так как EEPROM позволяет читать и записывать данные по одному байту, а FLASH требует записывать данные сразу страницей (блок данных).
В этой статье будет показано, как сохранять данные в EEPROM путем определения переменных специального типа. Для этого нужно подключить к модулю (файлу исходного кода C) библиотечный заголовочный файл eeprom.h с помощью директивы #include "avr/eeprom.h". Этот заголовочный файл можно найти в директории установки WinAVR, полный путь будет наподобие c: \ WinAVR-20100110 \ avr \ include \ avr \ eeprom.h.
В коде примера простое декларирование переменной EEPROM использует слово атрибута EEMEM:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include “inttypes.h”
#include “avr/io.h”
#include “avr/iom8.h”
#include “avr/eeprom.h”
//Сохранение в EEPROM проинициализированного байта.
uint8_t EEMEM eeprombyte=0x10;
//Сохранение в EEPROM проинициализированного слова.
uint16_t EEMEM eepromword=0x5555;
//Сохранение в EEPROM проинициализированной строки текста.
uint8_t EEMEM eepromstring[5]={"Test\0"};
int main(void)
{
//Переменная, размещенная в байте RAM.
uint8_t RAMbyte;
//Переменная, размещенная в слове RAM.
uint16_t RAMword;
//Массив байт, размещенный в RAM.
uint8_t RAMstring[5];
//Чтение байта из EEPROm и сохранение его в RAM.
RAMbyte = eeprom_read_byte(&eeprombyte);
//Чтение слова из EEPROM и сохранение его в RAM.
RAMword = eeprom_read_word(&eepromword);
//Копирование строки из EEPROM в RAM.
eeprom_read_block ((void *)&RAMstring, (const void *)&eepromstring,5);
return (0);
}
|
Ключевое слово атрибута EEMEM говорит компилятору, что переменная должна быть сохранена в EEPROM, и при этом создается специальный файл *.eep, который должен быть отдельно записан в EEPROM чипа AVR при программировании его программатором.
Можно посмотреть на результат компиляции этого кода компилятором AVR-GCC.
Size after:
main.elf :
section size addr
.text 156 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 8 8454144
.stab 876 0
.stabstr 132 0
.debug_aranges 20 0
.debug_pubnames 74 0
.debug_info 486 0
.debug_abbrev 316 0
.debug_line 240 0
.debug_str 271 0
Total 2579
Здесь приведена информация компилятора по размерам и адресам выделенных блоков памяти на различные секции кода. Выделенная жирным шрифтом строка (.eeprom 8 8454144) показывает размер занятой памяти в EEPROM. В нашем частном случае можно увидеть, что занятый размер составляет 8 байт: 1 байт на байтовую переменную, 2 байта на переменную слова, и 5 байт на текстовый массив, всего получается в сумме 8 занятых байт EEPROM.
Если открыть файл .eep (он обычно размещен в папке проекта) текстовым редактором, то можно увидеть, что это обычный HEX-файл [2] со следующим содержанием:
:0800000054657374005555109E
:00000001FF
Не забывайте о том, что этот файл должен быть записан в память микроконтроллера любым стандартным программатором, например ISP [1].
[Ссылки]
1. Программаторы для AVR. 2. Intel HEX: описание формата файла. |
Комментарии
uint8_t EEMEM eeprombyte=0x10;//будет создан файл .eep с этими данными
и
uint8_t EEMEM eeprombyte;//файл .eep создан НЕ будет.
Оба раза файлы самой прошивки .hex будут абсолютно одинаковые.
Значит данные при такой инициализации пишутся в EEPROM только программатором. Спасибо!
RSS лента комментариев этой записи