반응형

MCU는 전원이 꺼지고 켜진 경우 (POR : Power on Reset)
처리된 데이터(static 변수, 지역 변수, 매개 변수) 들은  메모리 상에서 남아있지 않고 사라진다.
그래서 MCU가 꺼지고 다시 켜졌을 경우, 데이터를 저장해야 할 때가 있다.
아두이노는 이 역할을 하는 내장 메모리가 있으며, 이를 EEPROM이라고 한다. (하드 디스크처럼 기간과 횟수가 그리 많지 않음.)


(초기 ROM(Read Only Memory)로 오로지 공장에서 출하 과정에서 메모리에  write가 되면, 그 이 후부턴 read 밖에 할 수 없었음. read 만 할 수 있는 문제를 해결하기 위해 자외선을 통해 몇 번의 write를 할 수 있는 EPROM이 개발됨. 조금 더 시간이 흘러 자외선이 아닌 전기로 write가 가능한 EEPROM(Electrically Erasable Programmable ROM)이 개발 됨.

2byte 정수를 1byte 배열로 나눠서 저장하는 글을 작성하면서 EEPROM 이야기를 하는 이유는
EEPROM에 데이터를 저장할 때 한 개의 주소에 1Byte(8bit) 씩 저장하므로 1byte를 초과하는 데이터는 나눠서 저장해야 하기 때문이다.
그리고 CRC-16 결과 값인 2byte 정수를 1byte 배열로 나눠서 저장한다.

CRC(cyclic redundancy check )  = 데이터의 무결성을 체크하기 위해 사용.

예제는 간단하다.
비트 마스킹을 통해 원하는 변수를 추출하고 다운 캐스팅을 통해 형 변환을 해주면 된다.

#include <stdio.h>

#define EEP_DATA_SIZE 2

static unsigned char eepImage[EEP_DATA_SIZE];

static void EepHandler_2byte_to_1byte(void){
    int l_result = 0x0102;            				// 2byte = 0x01_02
    
    eepImage[0] = (unsigned char)(l_result >> 8);	// 0x01_02 >> 8 = 0x00_01
    eepImage[1] = (unsigned char)(l_result & 0x00FF);  // 0x01_02 & FF = 0x00_02

}

int main()
{
    EepHandler_2byte_to_1byte();
    
    printf("EEPImage[0] : %d\n", eepImage[0]);
    printf("EEPImage[1] : %d\n", eepImage[1]);
    
    return 0;
}
728x90
반응형

+ Recent posts