안녕하세요, '소프트웨어 공장' 블로그에 오신 것을 환영합니다! 오늘은 ESP32에서 파일 시스템을 활용하는 방법에 대해 다뤄보겠습니다. 특히, SPIFFS를 설정하고 사용하는 방법, 그리고 FATFS를 통해 SD 카드를 관리하는 방법에 대해 설명해드리겠습니다. 모든 작업은 VS Code 개발 환경을 기준으로 진행됩니다.
ESP32 파일 시스템의 필요성
임베디드 시스템에서 데이터를 저장하고 불러오는 기능은 매우 중요합니다. ESP32와 같은 마이크로컨트롤러 환경에서는 파일 시스템을 통해 비휘발성 저장소에 데이터를 안전하게 저장할 수 있으며, 이를 통해 시스템의 유연성과 데이터 보존성을 높일 수 있습니다. ESP32에서는 내부 플래시 메모리와 외부 SD 카드를 활용해 파일을 저장하고 관리할 수 있는 두 가지 주요 파일 시스템, SPIFFS와 FATFS를 지원합니다.
SPIFFS란?
SPIFFS(Serial Peripheral Interface Flash File System)는 내장 플래시 메모리를 파일 시스템으로 활용할 수 있게 도와주는 파일 시스템입니다. 내장 플래시를 통해 비휘발성 데이터 저장을 수행할 수 있으며, 주로 설정 파일이나 작은 데이터 로깅에 사용됩니다.
SPIFFS 설정 및 사용하기
1. VS Code와 ESP-IDF 환경 설정
이 글에서는 여러분이 이미 VS Code와 ESP-IDF 플러그인을 설치하고 사용하고 있다고 가정하겠습니다. VS Code는 ESP32 개발을 편리하게 할 수 있는 강력한 IDE입니다. 우선, 프로젝트 폴더를 생성하고 필요한 설정 파일들을 준비합니다.
mkdir esp32_spiffs_example
cd esp32_spiffs_example
idf.py create-project .
이제 VS Code에서 해당 폴더를 열고, 필요한 헤더 파일과 코드를 추가해 보겠습니다.
2. SPIFFS 설정하기
SPIFFS를 사용하려면 먼저 sdkconfig
파일에서 SPIFFS 관련 설정을 켜야 합니다. menuconfig
를 사용하여 이를 설정할 수 있습니다.
idf.py menuconfig
menuconfig
에서 다음 경로로 이동합니다:
Component config --->
FAT Filesystem support --->
Enable SPIFFS filesystem
이 옵션을 활성화한 뒤 저장하고 종료합니다.
3. 코드 작성하기: SPIFFS 초기화 및 파일 읽기/쓰기
다음으로, SPIFFS 파일 시스템을 초기화하고 파일을 읽고 쓰는 예제를 작성해 보겠습니다. main.c
파일에 아래 코드를 추가합니다.
#include <stdio.h>
#include "esp_system.h"
#include "esp_spiffs.h"
void app_main(void) {
// SPIFFS 초기화
esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs",
.partition_label = NULL,
.max_files = 5,
.format_if_mount_failed = true
};
esp_err_t ret = esp_vfs_spiffs_register(&conf);
if (ret != ESP_OK) {
if (ret == ESP_FAIL) {
printf("[Error] SPIFFS 파티션을 마운트할 수 없습니다.\n");
} else if (ret == ESP_ERR_NOT_FOUND) {
printf("[Error] SPIFFS 파티션을 찾을 수 없습니다.\n");
} else {
printf("[Error] SPIFFS 초기화 실패: %s\n", esp_err_to_name(ret));
}
return;
}
printf("SPIFFS 파일 시스템이 성공적으로 마운트되었습니다.\n");
// 파일 생성 및 쓰기
FILE* f = fopen("/spiffs/hello.txt", "w");
if (f == NULL) {
printf("[Error] 파일을 열 수 없습니다.\n");
return;
}
fprintf(f, "안녕하세요, ESP32 파일 시스템 SPIFFS입니다!\n");
fclose(f);
printf("파일에 데이터를 성공적으로 썼습니다.\n");
// 파일 읽기
f = fopen("/spiffs/hello.txt", "r");
if (f == NULL) {
printf("[Error] 파일을 열 수 없습니다.\n");
return;
}
char line[64];
fgets(line, sizeof(line), f);
fclose(f);
printf("파일에서 읽은 데이터: %s\n", line);
}
이 예제에서는 SPIFFS를 초기화하고, 파일을 생성하여 데이터를 쓰고, 다시 파일을 읽는 과정을 보여줍니다.
4. 빌드 및 업로드
이제 코드를 빌드하고 ESP32에 업로드합니다.
idf.py build
idf.py flash
ESP32가 재부팅되면 SPIFFS 파일 시스템이 초기화되고, 지정한 파일에 데이터를 기록하고 읽는 것을 확인할 수 있습니다.
FATFS를 사용한 SD 카드 파일 시스템 관리
SPIFFS 외에도, ESP32는 외부 SD 카드를 사용하여 더 큰 용량의 데이터를 저장할 수 있습니다. 이를 위해 FATFS 파일 시스템을 사용할 수 있습니다.
1. SD 카드 핀 연결
ESP32 보드와 SD 카드를 연결합니다. 일반적으로 SPI 모드를 사용하여 연결하며, 다음 핀을 사용합니다:
- MISO: GPIO 19
- MOSI: GPIO 23
- SCK: GPIO 18
- CS: GPIO 5
이 핀 번호는 보드에 따라 다를 수 있으므로 데이터시트를 참고하시기 바랍니다.
2. FATFS 초기화 및 사용 코드 작성하기
다음은 SD 카드를 초기화하고 파일을 읽고 쓰는 예제입니다.
#include <stdio.h>
#include "esp_system.h"
#include "esp_log.h"
#include "driver/sdspi_host.h"
#include "driver/spi_common.h"
#include "sdmmc_cmd.h"
#define TAG "SD_CARD"
void app_main(void) {
esp_err_t ret;
// SD 카드 설정
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
sdspi_slot_config_t slot_config = SDSPI_SLOT_CONFIG_DEFAULT();
slot_config.gpio_miso = 19;
slot_config.gpio_mosi = 23;
slot_config.gpio_sck = 18;
slot_config.gpio_cs = 5;
// SD 카드 초기화
sdmmc_card_t* card;
ret = sdmmc_host_init();
if (ret != ESP_OK) {
ESP_LOGE(TAG, "SD 카드 호스트 초기화 실패");
return;
}
ret = sdspi_host_init_device(host.slot, &slot_config);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "SDSPI 장치 초기화 실패");
return;
}
ret = sdmmc_card_init(&host, &card);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "SD 카드 초기화 실패");
return;
}
ESP_LOGI(TAG, "SD 카드가 성공적으로 초기화되었습니다. 이름: %s", card->cid.name);
// 파일 생성 및 쓰기
FILE* f = fopen("/sdcard/hello_sd.txt", "w");
if (f == NULL) {
ESP_LOGE(TAG, "파일을 열 수 없습니다.");
return;
}
fprintf(f, "안녕하세요, SD 카드 파일 시스템입니다!\n");
fclose(f);
ESP_LOGI(TAG, "SD 카드 파일에 데이터를 성공적으로 썼습니다.");
// 파일 읽기
f = fopen("/sdcard/hello_sd.txt", "r");
if (f == NULL) {
ESP_LOGE(TAG, "파일을 열 수 없습니다.");
return;
}
char line[64];
fgets(line, sizeof(line), f);
fclose(f);
ESP_LOGI(TAG, "파일에서 읽은 데이터: %s", line);
}
이 예제에서는 SD 카드를 초기화하고 파일을 생성하여 데이터를 쓰고, 다시 파일을 읽는 과정을 보여줍니다.
결론
오늘은 ESP32에서 파일 시스템을 활용하는 방법에 대해 알아보았습니다. SPIFFS를 사용해 내장 플래시 메모리에 파일을 저장하고, FATFS를 사용해 SD 카드를 관리하는 방법을 VS Code 개발 환경에서 설정하고 사용해 보았습니다. 파일 시스템은 데이터를 비휘발성으로 저장하고, 이를 손쉽게 불러올 수 있는 매우 중요한 기능입니다. 앞으로의 ESP32 프로젝트에서 파일 시스템을 적극적으로 활용해 보세요!
'ESP32 IDF' 카테고리의 다른 글
ESP32 디버깅(Debugging) 및 성능 최적화(Optimization) (0) | 2024.11.17 |
---|---|
ESP32 IDF OTA 펌웨어 업데이트 (0) | 2024.11.16 |
ESP32 IDF Sleep (0) | 2024.11.14 |
ESP32 IDF UART (0) | 2024.11.13 |
ESP32 IDF SPI (0) | 2024.11.12 |