아두이노 Arduino

[아두이노]메모리 종류와 기능 (Program Memory, Flash Memory, EEPROM)

끄적끄적아무거나 2022. 5. 8. 13:19
반응형

 

목차

     

     

     

    아두이노(Arduino) 메모리란? : 종류

     

     

    아두이노는 위 그림과 같이 3가지의 메모리로 구성됩니다.

     

    • Program Memory
    • Data Memory
    • EEPROM

     

    아두이노(ATmega168)의 경우 Program Memory의 사이즈는 32KByte 이고 Data Memory는 2KByte의 크기이고 EEPROM은 0.5KByte 입니다. 

     

     

     

     

     

    아두이노(Arduino) 메모리란? : 기능

     

     

    Program Memory는 플래시 메모리(Flash Memory)라고도 하는데 사용자가 스케치 소프트웨어에서 작성한 코드는 Program Memory로 올라 갑니다.

     

    Data Memory는 SRAM(Static Random Memory)로 구성되어 있는데 장점은 CPU에 가까이 위치하여 속도가 빠릅니다. 하지만 리셋(Reset)을 하게 되면 SRAM에 저장된 값이 사라집니다. 그래서 Program Memory에서 동작에 필요한 변수 값을 저장하거나 불러올때 사용 합니다.

     

    EEPROM(electrically erasable programmable read-only memory) 은 Read Only Memory로 아두이노에 기본적으로 저장되어 있는 동작으로 리셋이 되어도 남아있는 기능입니다. 작은 하드드라이브 처럼 보드의 전원이 꺼져도 저장되어 있는데 내용이 지워지지 않습니다. 

     

     

     

     

     

     

    아두이노(Arduino) EEPROM 읽기(Read) 쓰기(Write)

    아두이노 보드의 EEPROM 메모리는 EEPROM.h 라이브러리를 사용해서 읽고 쓰기가 가능합니다.

     

    아래 예제 코드는 아두이노 홈페이지에서 제공하는 코드로 해당 코드로 사용법을 알아 보겠습니다.(https://docs.arduino.cc/learn/built-in-libraries/eeprom)

     

    예제 코드 - 읽기>>

    #include <EEPROM.h>
    
    int a = 0;
    int value;
    
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop()
    {
      value = EEPROM.read(a);
    
      Serial.print(a);
      Serial.print("\t");
      Serial.print(value);
      Serial.println();
    
      a = a + 1;
    
      if (a == 512)
        a = 0;
    
      delay(500);
    }

    6~9번 라인: Serial 통신을 연결합니다.

    13번 라인: 0번 주소부터 511번 주소에 해당하는 EEPROM의 값을 읽어옵니다.

     

    결과>>

     

     

     

     

     

    다음 코드는 EEPROM에 작성하는 방법을 알아 보겠습니다.

     

    예제 코드>>

    #include <EEPROM.h>
    
    int a = 0;
    int value;
    
    void setup()
    {
      Serial.begin(9600);
      EEPROM.write(0, 77);
    }
    
    void loop()
    {
      value = EEPROM.read(a);
    
      Serial.print(a);
      Serial.print("\t");
      Serial.print(value);
      Serial.println();
    
      a = a + 1;
    
      if (a == 512)
        a = 0;
    
      delay(500);
    }

    9번 라인: 0번째 주소에 77을 입력하였습니다. 

     

     

    결과>>

    0번째 주소의 값만 값이 변경되었습니다.

     

     

     

     

     

    반응형