플래시 메모리 - 7. 실습 및 응용 (실제 사용 및 분석) (7.3 임베디드 시스템에서 플래시 메모리 활용)

2025. 2. 23. 16:40정보기술/하드웨어

7.3 임베디드 시스템에서 플래시 메모리 활용

임베디드 시스템은 제한된 자원에서 효율적인 데이터 저장과 빠른 부팅을 필요로 하며, 플래시 메모리는 이러한 요구를 충족하는 핵심 저장 장치로 사용된다.
특히 마이크로컨트롤러(MCU)에서는 SPI/NOR 플래시, 임베디드 리눅스 환경에서는 NAND 플래시가 주로 활용된다.


7.3.1 마이크로컨트롤러에서 SPI/NOR 플래시 활용

① SPI/NOR 플래시 개요

  • NOR 플래시(NOR Flash)는 빠른 읽기 속도와 높은 신뢰성을 갖춘 비휘발성 메모리로, MCU(마이크로컨트롤러)의 부트 코드 및 펌웨어 저장에 사용됨.
  • SPI(NOR) 플래시는 직렬 통신 방식인 SPI(Serial Peripheral Interface)를 이용하여 MCU와 연결되며, 저전력, 소형화가 가능하여 다양한 임베디드 시스템에서 사용됨.
  • 빠른 랜덤 액세스를 제공하지만, 쓰기 및 지우기 속도가 NAND 플래시보다 느린 특징을 가짐.

📌 SPI/NOR 플래시 특징
빠른 랜덤 액세스 속도 → 부팅 코드 및 실행 코드 저장에 적합.
소형 패키지 지원 → MCU와 쉽게 통합 가능.
높은 내구성 및 신뢰성 → 자동차, 의료기기, 산업용 장비에서 널리 사용.
비휘발성 → 전원이 꺼져도 데이터 유지 가능.

📌 SPI/NOR 플래시 사용 예시

  • MCU의 부트로더 저장 → 임베디드 펌웨어 및 시스템 초기화 코드 저장.
  • 자동차 ECU → 차량용 전자제어장치의 실시간 운영 데이터 저장.
  • 스마트카드 및 보안 모듈 → 인증 키 및 보안 코드 저장.
  • 산업 자동화 기기 → 공장 자동화 장비 및 로봇 컨트롤러.

② SPI/NOR 플래시를 마이크로컨트롤러에서 사용하는 방법

📌 MCU에서 SPI 플래시 연결 및 코드 예시

1️⃣ SPI 핀 연결 예시

MCU 핀 SPI 플래시 핀
MOSI (Master Out Slave In) SI (Serial In)
MISO (Master In Slave Out) SO (Serial Out)
SCK (Serial Clock) SCK (Clock)
CS (Chip Select) CS (Chip Select)

2️⃣ SPI 플래시 제어 코드 (C 언어, HAL 라이브러리 사용)

#include "spi.h"
#include "gpio.h"

#define FLASH_CS_LOW()   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
#define FLASH_CS_HIGH()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)

uint8_t SPI_Flash_ReadID(void) {
    uint8_t cmd = 0x9F;  // JEDEC ID Read Command
    uint8_t id[3];

    FLASH_CS_LOW();
    HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
    HAL_SPI_Receive(&hspi1, id, 3, HAL_MAX_DELAY);
    FLASH_CS_HIGH();

    return (id[0] << 16) | (id[1] << 8) | id[2];
}

void SPI_Flash_WriteEnable(void) {
    uint8_t cmd = 0x06;  // Write Enable Command
    FLASH_CS_LOW();
    HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
    FLASH_CS_HIGH();
}

📌 MCU에서 SPI 플래시 활용 시 고려 사항
SPI 클럭 속도 조정 → 플래시 메모리의 최대 SPI 속도와 MCU 지원 속도를 맞출 것.
쓰기 보호(WP) 핀 활용 → 중요한 데이터가 손상되지 않도록 하드웨어 보호.
웨어 레벨링 알고리즘 적용 → 일정한 블록만 집중적으로 쓰이지 않도록 제어.


7.3.2 리눅스 환경에서 NAND 플래시 마운트 및 파일 시스템 사용

① NAND 플래시 개요

  • NAND 플래시(NAND Flash)는 대용량 데이터 저장이 가능하며, 임베디드 리눅스 환경에서 루트 파일 시스템(rootfs) 및 데이터 저장용으로 사용됨.
  • NAND 플래시는 페이지(Page) 단위 쓰기, 블록(Block) 단위 삭제가 필요하며, 파일 시스템에서 이를 관리해야 함.

📌 NAND 플래시 특징
대용량 데이터 저장 가능 → eMMC, UFS 등에서 사용됨.
비휘발성 메모리 → 전원이 꺼져도 데이터 유지.
빠른 연속 쓰기 성능 → 로그 저장, 펌웨어 저장 등에 적합.
오류 정정 필요 (ECC) → NAND 플래시는 시간이 지나면 데이터 오류 발생 가능.

📌 NAND 플래시 활용 예시

  • 임베디드 리눅스 시스템의 루트 파일 시스템 저장
  • IoT 및 스마트 디바이스의 데이터 로깅
  • 자동차 인포테인먼트 시스템의 멀티미디어 저장소
  • 네트워크 장비(라우터, NAS)의 설정 및 로그 저장

② NAND 플래시를 리눅스에서 마운트하는 방법

📌 1️⃣ NAND 플래시 드라이버 확인

dmesg | grep -i nand
ls /proc/mtd  # NAND 메모리가 MTD(Memory Technology Device)로 인식되었는지 확인

📌 2️⃣ MTD 파티션 확인 및 포맷

cat /proc/mtd  # NAND 플래시의 MTD 디바이스 목록 출력

출력 예시:

dev:    size   erasesize  name
mtd0: 00040000 00010000 "bootloader"
mtd1: 003c0000 00020000 "kernel"
mtd2: 07c00000 00020000 "rootfs"

rootfs(mtd2) 파티션을 마운트할 파일 시스템 포맷 선택

  • JFFS2 (Journaling Flash File System 2) → 저널링 지원, 작은 파일 저장 최적화.
  • UBIFS (Unsorted Block Image File System) → 최신 NAND 플래시용, 대용량 파일 처리 최적화.

📌 3️⃣ JFFS2 파일 시스템으로 포맷 및 마운트

# JFFS2 포맷 수행
sudo apt install mtd-utils
sudo flash_eraseall /dev/mtd2
sudo mkfs.jffs2 -r /mnt/rootfs -o rootfs.jffs2

# 마운트 수행
sudo mount -t jffs2 /dev/mtdblock2 /mnt/nand

📌 4️⃣ UBIFS 파일 시스템 사용 (최신 NAND 지원)

# UBIFS 포맷 수행
sudo ubiformat /dev/mtd2
sudo ubiattach -m 2
sudo mount -t ubifs ubi0 /mnt/nand

JFFS2 vs UBIFS 비교

파일 시스템 장점  단점
JFFS2 저용량 NAND에 적합, 간단한 구조 대용량 지원 어려움, 속도 느림
UBIFS 대용량 지원, 고속 성능 커널 패치 필요

정리

  • SPI/NOR 플래시 → MCU 부트로더 저장, 빠른 랜덤 액세스, 신뢰성 높은 데이터 저장.
  • NAND 플래시 → 리눅스 기반 임베디드 시스템에서 루트 파일 시스템 및 데이터 저장.
  • JFFS2/UBIFS 파일 시스템 → NAND 플래시 전용 파일 시스템으로 최적화된 저장 방식 제공.