임베디드 용어 정리

EEPROM(Electrically Erasable Programmable Read-Only Memory)

minhyeok.lee 2025. 4. 16. 23:44
반응형

💾 EEPROM이란?

1. EEPROM은 전기를 이용해 지우고 다시 쓸 수 있는 비휘발성 메모리
2. MCU 등 임베디드 시스템에서 설정값, 보정값, 카운터, 고유 ID 등의 저장에 널리 사용됨

 


🧠 기본 개념

  • 비휘발성 메모리: 전원이 꺼져도 데이터가 유지됨
  • 읽기/쓰기 모두 가능
  • 바이트 단위 접근 가능 (Flash보다 세밀한 제어)
  • Flash보다 쓰기 수명이 길고 구현 간편

⚙️ 동작 특성

항목 설명
저장 방식 플로팅 게이트 트랜지스터 기반 비휘발성 저장
읽기 빠름, 일반적으로 I2C/SPI 통신 기반
쓰기 보통 수 밀리초(5~10ms), 일부는 페이지 버퍼 지원
쓰기 단위 바이트 단위 or 페이지 단위 (보통 16/32/64바이트 단위로 최적화됨)
지우기 단위 없음 — 바이트 단위로 덮어쓰기 가능
내구성 보통 1,000,000회 이상의 쓰기 수명 (Flash보다 우수)
전원 안정성 매우 안정적 — 쓰기 완료 시 전원 차단에도 데이터 유지 가능

🧩 EEPROM 종류

유형 설명
내장 EEPROM 일부 MCU에 내장됨 (예: ATmega328P, STM32 일부 시리즈 등)
외장 EEPROM I2C 또는 SPI 인터페이스로 연결 (예: 24C32, 25LC256 등)

📦 외부 EEPROM 예시

모델 인터페이스 크기 쓰기 단위 특징
24C02 I2C 2Kbit (256B) 바이트 저용량, 주소 제한 있음
24C256 I2C 32Kbyte 페이지 (64B) 널리 사용되는 표준형
25LC512 SPI 64Kbyte 페이지 (128B) 빠른 속도, SPI 기반

📚 MCU에서 EEPROM 사용 사례

용도 설명
설정값 저장 예: 센서 오프셋, 무선 채널, 디바이스 모드 등
부트카운터 저장 전원 ON 횟수 기록, 사용량 통계 등
고유 식별자 저장 UUID, device ID, 페어링 정보 등
공장 보정값 저장 캘리브레이션 값, 기기별 커스터마이징 데이터 저장

✅ EEPROM vs Flash 비교

항목 EEPROM Flash Memory
쓰기 단위 바이트/페이지 섹터 단위 (보통 4KB)
쓰기 전 지우기 필요 여부 ❌ 불필요 ✅ 필수
쓰기 속도 빠름 (단일 바이트 또는 페이지) 느림 (섹터 지우기 → 쓰기)
쓰기 수명 약 1,000,000회 약 100,000회
인터페이스 I2C, SPI 내부 직접 접근, XIP 가능
전원 차단 안전성 높음 낮음 (쓰기 중 꺼지면 데이터 손상 위험)
구현 난이도 낮음 중간~높음 (섹터 오프셋 계산 등 필요)

🔐 사용 시 주의사항

  • 쓰기 사이클 관리 필요: 동일 주소 반복 쓰기보다는 wear leveling 구조 적용 권장
  • 전원 꺼짐 보호: 일부 EEPROM은 내부 보호 회로 내장, 안정성 높음
  • 페이지 경계 주의: 페이지 크기 초과시 자동 wrap-around 가능 → 데이터 손상 주의
  • 쓰기 완료 확인: write delay (_delay_ms()) 또는 ACK polling 필요

💡 EEPROM 사용 예시 (Arduino + 24C256)

#include <Wire.h>
#define EEPROM_ADDR 0x50

void writeEEPROM(int addr, byte data) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write((addr >> 8) & 0xFF); // high byte
  Wire.write(addr & 0xFF);        // low byte
  Wire.write(data);
  Wire.endTransmission();
  delay(5); // write delay
}

byte readEEPROM(int addr) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write((addr >> 8) & 0xFF);
  Wire.write(addr & 0xFF);
  Wire.endTransmission();
  Wire.requestFrom(EEPROM_ADDR, 1);
  return Wire.read();
}
반응형