View RSS Feed

alexan_e

Write/read the internal EEPROM in AVR using avrgcc (winAVR)

Rating: 2 votes, 5.00 average.
The following macro can be used to simplify the process of using the internal AVR EEPROM

Code:
#include <avr/eeprom.h>
// defines for eeprom access	
#define read_eeprom_byte(address) eeprom_read_byte ((const uint8_t*)address)
#define write_eeprom_byte(address,value) eeprom_write_byte ((uint8_t*)address,(uint8_t)value)
#define read_eeprom_word(address) eeprom_read_word ((const uint16_t*)address)
#define write_eeprom_word(address,value) eeprom_write_word ((uint16_t*)address,(uint16_t)value)
#define read_eeprom_dword(address) eeprom_read_dword ((const uint32_t*)address)
#define write_eeprom_dword(address,value) eeprom_write_dword ((uint32_t*)address,(uint32_t)value)
#define read_eeprom_float(address) eeprom_read_float ((const float *)address)
#define write_eeprom_float(address,value) eeprom_write_float ((float*)address,(float)value)
#define read_eeprom_array(address,value_p,length) eeprom_read_block ((void *)value_p, (const void *)address, length)
#define write_eeprom_array(address,value_p,length) eeprom_write_block ((const void *)value_p, (void *)address, length)

uint8_t	my_byte;
uint16_t my_word;
uint32_t my_dword;
float my_float;
char my_text[10]={"123456789\0"};

//--------------- code inside main-----------------
// these will be written at runtime (and stored in first run), data will not be included in the eep file
write_eeprom_byte(1,0x0A);		  // write in eeprom position 1 the value 0x0A
write_eeprom_word(3,0x0AAA);		  // write in eeprom position 3 the value 0x0AAA
write_eeprom_dword(10,0x0AAAAAAA);// write in eeprom position 10 the value 0x0AAAAAAA
write_eeprom_float(5,0.123456);// write in eeprom position (5) the value 0.123456 , note it will occupy 4 bytes in eeprom 5,6,7,8
write_eeprom_array(10,my_text,8);    // write in eeprom position 10 the 8 first characters of my_text array


// and you can read them using
my_byte=read_eeprom_byte(1);			
my_word=read_eeprom_word(3);		
my_dword=read_eeprom_dword(10);
my_float=read_eeprom_float(5);
read_eeprom_array(10,my_text,5); // read to my_text array 5 char starting from eeprom position 10
or if you don't want to bother about specific eeprom address
Code:
uint8_t EEMEM	  my_eeprom_byte;
uint16_t EEMEM	  my_eeprom_word;
uint32_t EEMEM    my_eeprom_dword;
float EEMEM my_eeprom_float;
uint8_t 	  my_byte;
uint16_t	  my_word;
uint32_t 	  my_dword;
float 	  my_float;


//--------------- code inside main-----------------

write_eeprom_byte(&my_eeprom_byte,0x0f);		// this will be written at runtime (and stored in first run), it will not be included in the eep file
write_eeprom_word(&my_eeprom_word,0x0fff);		// this will be written at runtime (and stored in first run), it will not be included in the eep file
write_eeprom_dword(&my_eeprom_dword,0x0fffffff);	// this will be written at runtime (and stored in first run), it will not be included in the eep file
write_eeprom_float(&my_eeprom_float, 0.1234567);	// this will be written at runtime (and stored in first run), it will not be included in the eep file

// and you can read them using
my_byte=read_eeprom_byte(&my_eeprom_byte);			
my_word=read_eeprom_word(&my_eeprom_word);		
my_dword=read_eeprom_dword(&my_eeprom_dword);
my_float=read_eeprom_float(&my_eeprom_float);
if you want to store some data in the eeprom when you compile the code (so they are added to the eep file and use them to fill the avr eeprom when you program the device),
you need to use the EEMEM and initialize it with a value like the following example:

Code:
//

uint8_t EEMEM eeprombyte=0x10;		//store initial byte to eeprom, eep file will include this

uint16_t EEMEM eepromword=0x5555;	//store initial word to eeprom, eep file will include this

uint8_t EEMEM eepromstring[5]={"Test\0"}; 	//store string to eeprom, eep file will include this

int main(void)
{
 uint8_t RAMbyte;		//RAM byte variable
 uint16_t RAMword;		//RAM word variable
 uint8_t RAMstring[5];		//RAM array of bytes

 RAMbyte = read_eeprom_byte(&eeprombyte);	    //read byte from EEPROM and store to RAM 
 RAMword = read_eeprom_word(&eepromword);	    //read word from EEPROM and store to RAM
 read_eeprom_array(&eepromstring,&RAMstring,5);		//copy string from EEPROM to RAM
....
}
Alex

Updated 3rd August 2014 at 18:24 by alexan_e (Added float)

Tags: None Add / Edit Tags
Categories
AVR

Comments