본문 바로가기
라즈베리파이 피코

라즈베리파이 피코 플래시메모리에 16비트 데이터 쓰고 읽기

by js-park 2023. 2. 16.

라즈베리 파이 피코는 자체적으로 EEPROM을 내장하고 있지 않기 때문에 피코의 플래시메모리를 활용하여 EEPROM과 같은 역할을 수행할 수 있도록 하는 방법을 알아보고자 합니다.

 

EEPROM은 반영구적인 저장소로, 전기가 끊어져도 그 내용이 지워지지 않고 보존됩니다. 플래시메모리도 비슷한 방식으로 데이터를 저장할 수 있어서 EEPROM처럼 비휘발성 저장소로 사용될 수 있습니다. 하지만 EEPROM과는 다르게, 플래시메모리에 데이터를 쓰기 위해서는 이전 데이터를 먼저 삭제해야 하므로, 덮어쓰기 작업에 따른 성능 저하가 있을 수 있습니다. 또한, 일반적으로 EEPROM보다는 쓰기/삭제 주기 수가 낮기 때문에 플래시메모리의 사용 조건과 명세를 지켜야 합니다.

 

피코의 플래시 메모리의 경우 100,000회 이상의 지움/쓰기 주기를 제공하는 것으로 알려져 있습니다. 이는 대부분의 응용 프로그램에서 충분한 수명을 제공합니다. 단, 사용자가 과도하게 지움/쓰기를 하는 경우, 수명이 짧아질 수 있습니다.

 

아래의 코드는 피코에서 16비트 변수가 가지고 있는 값을 플래시메모리에 저장하고 다시 읽어내어 출력하는 예제입니다.

 

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/bootrom.h"

// Define the flash memory address where we want to store our data
#define FLASH_ADDRESS 0x10000

// Define a struct to hold our 16-bit variable
typedef struct {
    uint16_t data;
} FlashData;

int main() {
    // Initialize the standard library functions
    stdio_init_all();

    // Create a FlashData struct and set its value
    FlashData data = { 0xABCD };

    // Erase the flash page that contains our data
    flash_range_erase(FLASH_ADDRESS, sizeof(data));

    // Write our data to the flash memory
    flash_range_program(FLASH_ADDRESS, &data, sizeof(data));

    // Read our data from the flash memory
    FlashData read_data;
    memcpy(&read_data, (void *)FLASH_ADDRESS, sizeof(read_data));

    // Print out the value we read from the flash memory
    printf("Data: 0x%04X\n", read_data.data);

    return 0;
}

 

위 코드에서는 먼저, 플래시 메모리에 저장할 변수를 담을 구조체 FlashData를 정의합니다. 이 구조체에는 uint16_t 타입의 data 필드가 하나 있습니다.

그리고 main() 함수에서는 다음과 같은 작업을 수행합니다.

  1. 표준 라이브러리 함수를 초기화합니다.
  2. FlashData 구조체 변수 data를 생성하고, 0xABCD 값을 설정합니다.
  3. 플래시 메모리에 저장할 data 변수의 위치를 지우고, 해당 위치에 data 변수를 저장합니다.
  4. 플래시 메모리에서 데이터를 읽어와 read_data 변수에 저장합니다.
  5. 읽어온 데이터를 출력합니다.

플래시 메모리에 데이터를 쓸 때는 먼저 해당 위치를 지우고, 그 위치에 데이터를 씁니다. 이 코드에서는 flash_range_erase() 함수를 사용하여 데이터가 저장될 위치를 지우고, flash_range_program() 함수를 사용하여 데이터를 씁니다.

읽어올 때는 단순히 데이터가 저장된 위치를 읽어오면 됩니다. 이 코드에서는 memcpy() 함수를 사용하여 플래시 메모리에서 읽어온 데이터를 read_data 변수에 복사합니다.

반응형

댓글