본문 바로가기
myCortex

내장 flash 메모리

by irmus 2008. 6. 27.
Luminarymicro의 LM3S 시리즈 칩셋이 내장하고 있는 flash 메모리에 대해 살펴보자.
모델별로 다양한 사이즈를 가지고 있으며, myCortex 시리즈를 구성하는 모델들은 다음과 같다.
  • myCortex-LM308 - 16kByte
  • myCortex-LM608 - 32kByte
  • myCortex-LM808 - 64kByte
  • myCortex-LM8962 - 256kByte

플래시 메모리에 저장된 값은 일반 RAM처럼 byte 단위로 직접 읽을 수 있다. 반면 값을 write하는 것은 조금 다르다. 플래시 메모리는 비트값 '1'을 '0'으로 변환하는 것만 가능하다. 즉 한번 '0'으로 값이 바뀐 비트는 다시 '1'로 write할 수 없다는 뜻이다. 이것만 가능하다면 한번만 프로그래밍할 수 있고, 그 값을 바꿀 수 없는 일회성 메모리가 되겠지만, erase를 통해서 '0' 비트를 '1' 비트로 변환하는 것이 가능하다. 단, erase는 한번에 한 바이트나 한 워드 단위가 아니라 블럭 단위로만 가능하다는 점이 write와의 차이점이다.
LM3S 시리즈의 플래시 메모리는 1kByte 단위의 블럭(block)으로 구성되어있다. 즉 LM308은 총 16개의 블럭을 가진 샘이다. 위에서 말한 것과 같이 블럭은 flash erase를 할 수 있는 최소 단위이다.
플래시 메모리에 어떤 값을 write하는 과정을 살펴보면 아래와 같은 단계를 거친다.
  1. 원하는 주소를 포함한 block을 erase 한다. 1kByte 전체가 '1' 비트로 가득 채워진다.
  2. 원하는 주소에 값을 write한다. 주소는 4byte 단위로만 접근 가능하다. write는 비트값 '1'을 '0'으로 바꾸는 것을 의미한다.
실제적인 접근에서는 이처럼 2 단계만으로 되지는 않는다. 1kByte의 블럭 중 일부의 값만 변경하고자 하는 경우에는 블럭 전체의 내용을 읽어서 다른 곳에 임시로 저장(backup)해 두고 block erase를 한 후에 백업해 뒀던 데이터와 쓰고자 하는 데이터를 섞어서 다시 write해 줘야 한다.

플래시 메모리 관련 기능들은 DriverLib의 flash.c 파일에서 다루고 있다. 위에서 언급한 erase와 write는 다음 두가지 함수를 호출하면 된다.
  • FlashErase() - 플래시 블럭 erase
  • FalshPrigram() - 원하는 사이즈만큼 write


myCortex 시리즈의 예제 중 flash 예제에서 플래시 메모리에 값을 읽고 쓰는 방법을 볼 수 있다.
이 예제는 UART를 통하여 PC와 통신한다. 안전하고 확실한 통신을 위해 SLIP 인코딩/디코딩을 사용하고 있다. 처음 전원이 인가되면 prompt를 출력하고 명령 대기상태가 된다. 이 상태에서 PC가 커맨드를 보내면 해당 작업을 수행한다.
커맨드에는 write와 read 두가지가 있다. write 커맨드는 패킷의 시작이 '<' 문자이고, read 커맨드는 패킷의 시작이 '>' 문자이다. write 커맨드는 패킷에서 '<'를 제외한 나머지 모든 문자열을 플래시 메모리에 write한다. read 커맨드는 플래시에 저장된 문자열을 읽어 PC로 반송한다.
사용자 삽입 이미지
위 화면은 ComPortMaster를 이용해서 SLIP 인코딩 된 데이타를 주고받는 화면을 캡쳐한 것이다.
Recv창의 첫번째 줄에서 보드가 리셋될 때 prompt가 나오는 것을 볼 수 있다.
'<Hello~!' 커맨드를 보내면 보드에서는 잘 받았음을 확인시켜주기 위해 커맨드 그대로 반송(echo)한다.
다시 '>' read 커맨드를 보내면 현재 플래시 메모리에 저장된 Hello~! 문자열이 반환되는 것을 3번째 줄에서 볼 수 있다.
4번째 줄은 이 문자열이 휘발성인 RAM이 아니라 비휘발성인 flash 메모리에 저장된 것임을 확인시켜주기 위해 일부러 보드를 리셋한 것이다.
이 상태에서 write 커맨드 없이 read 커맨드만 내렸을 때 플래시 메모리에 저장되어있던 'Hello~!' 문자열이 그대로 반환되는 것을 확인할 수 있다.