대부분의 AVR은 EEPROM을 내장하고 있으며, 비휘발성 메모리이기 때문에 시스템 파라메터나 설정 데이터 등 전원이 인가되지 않아도 유지해야 할 데이터들을 저장하는데 많이 사용된다. 비록 비휘발성이긴 하나 수명에는 제한이 있는데 datasheet에 의하면 읽는 동작은 무제한 가능하지만 쓰기는 약 100,000번 정도만 가능하다고 한다. 따라서 EEPROM에 많이 의존하는 계통을 개발할 경우에는 이러한 점을 고려해야 한다.


 AVR은 이러한 내장 EEPROM에 데이터를 읽고 쓰기 위해서 특정한 IOCR을 이용하여 그 읽고 쓰는 동작을 제어하며 WinAVR은 이러한 동작을 수행하는 편리한 함수들을 제공한다. 이 함수들은 <avr/eeprom.h>에 정의되어 있으므로 EEPROM에 접근하기 위해서는 이 헤더화일을 반드시 인클루드시켜야 한다.


#include <avr/eeprom.h>


매뉴얼에 제시된 함수들을 모두 리스트업하면 다음과 같다.


uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__
uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__
uint32_t eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__
float eeprom_read_float (const float *__p) __ATTR_PURE__
void eeprom_read_block (void *__dst, const void *__src, size_t __n)
void eeprom_update_byte (uint8_t *__p, uint8_t __value)
void eeprom_update_word (uint16_t *__p, uint16_t __value)
void eeprom_update_dword (uint32_t *__p, uint32_t __value)
void eeprom_update_float (float *__p, float __value)
void eeprom_update_block (const void *__src, void *__dst, size_t __n)
void eeprom_write_byte (uint8_t *__p, uint8_t __value)
void eeprom_write_word (uint16_t *__p, uint16_t __value)
void eeprom_write_dword (uint32_t *__p, uint32_t __value)
void eeprom_write_float (float *__p, float __value)
void eeprom_write_block (const void *__src, void *__dst, size_t __n)

이 함수들을 분류하여 요약하면 다음 표와 같다.


[표 1] EEPROM에 접근하기 위한 함수들 요약

데이터

읽기

갱신

쓰기

byte

eeprom_read_byte()

eeprom_update_byte()

eeprom_write_byte()

word

eeprom_read_word()

eeprom_update_word()

eeprom_write_word()

dword

eeprom_read_dword()

eeprom_update_dword()

eeprom_write_dword()

float

eeprom_read_float()

eeprom_update_float()

eeprom_write_float()

block

eeprom_read_block()

eeprom_update_block()

eeprom_write_block()


이 표에서 보면 크게 세 가지 부류의 함수들이 정의되어 있는 것을 알 수 있는데 읽기/갱신/쓰기이다. 읽기함수는 EEPROM에서 데이터를 읽어오는 동작을 수행하며 전술한 바와 같이 읽는 동작과 EEPROM의 수명과는 무관하다. 쓰기 함수는 쓰려고 하는 그 장소의 데이터와는 상관없이 무조건 주어진 데이터를 쓰는 동작을 수행한다. 이에 반해서 갱신 함수는 쓰려는 데이터와 현재의 데이터가 서로 다른 경우에만 쓰기를 수행한다. 따라서 EEPROM의 수명을 고려하면 쓰기 함수보다는 갱신함수가 무조건 유리하기 때문에 새롭게 개발하는 경우라면 쓰기함수 대신 갱신함수를 사용해야 한다. 쓰기 함수는 과거에 개발된 프로그램과의 호환을 위하여 남겨둔 것이다.


 만약 46번지에서 한 바이트 값을 읽어서 변수에 저장하려면 다음과 같이 하면 된다. 데이터가 word, dword, float인 경우도 유사하게 데이터를 읽어낼 수 있다.


#include <avr/eeprom.h>
int main(void) {
   uint8_t byA;
   byA = eeprom_read_byte((const uint8_t*)46);
}


갱신하는 동작은 주소 외에 기록할 데이터도 입력해야 한다.


#include <avr/eeprom.h>
int main(void) {
   uint8_t byA = 0xEA;
   eeprom_update_byte((uint8_t*)46, byA);
}


만약 워드 데이터를 쓰는 경우라면 다음과 같을 것이다.


#include <avr/eeprom.h>
int main(void) {
   eeprom_update_word((uint16_t*)46, 0x1234);
}


dword나 float형 변수값을 갱신하는 경우에도 위의 경우와 유사하다.



Posted by 살레시오
,