Программирование AVR Сохранение констант в EEPROM при использовании WinAVR (GCC) Fri, March 29 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Сохранение констант в EEPROM при использовании WinAVR (GCC) Печать
Добавил(а) microsin   

avrsМикроконтроллеры 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: описание формата файла

 

Комментарии  

 
+1 #1 Влад 27.12.2016 17:29
Спасибо за толковое объяснение. Уже часа полтора пытаюсь найти информацию. Суть поисков - каждый ли раз при запуске программы значение записывается в EEPROM? И тут нашёл ответ.
uint8_t EEMEM eeprombyte=0x10;//будет создан файл .eep с этими данными
и
uint8_t EEMEM eeprombyte;//файл .eep создан НЕ будет.

Оба раза файлы самой прошивки .hex будут абсолютно одинаковые.

Значит данные при такой инициализации пишутся в EEPROM только программатором. Спасибо!
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page