한 픽셀에 몇 비트를 쓰는지 먼저 확인합니다
픽셀(pixel)은 화면을 이루는 한 점입니다. 프레임 버퍼(framebuffer)는 화면 한 장의 픽셀값을 보관하는 메모리 공간이며, 비트(bit) 여덟 개가 바이트(byte) 하나입니다. 흑백 두 상태만 저장하는 1 bpp(bits per pixel) 형식이라면 픽셀 하나에 1비트를 씁니다.
400×300 픽셀을 1 bpp로 빈틈없이 저장하면 400 × 300 ÷ 8 = 15,000바이트입니다. 한 줄은 400 ÷ 8 = 50바이트이고, 300줄이면 같은 결과가 나옵니다. 15,000바이트는 약 14.65 KiB입니다. KiB(kibibyte)는 1,024바이트이므로 15,000바이트를 1,024로 나눈 값입니다.
이 계산은 한 장, 1 bpp, 추가 여백 없이 저장한다는 조건의 값입니다. 실제 라이브러리가 색상이나 계조를 더 저장하거나, 두 장을 번갈아 쓰는 이중 버퍼링(double buffering)을 사용하거나, 줄마다 저장 길이를 맞추는 패딩(padding)을 넣으면 더 필요합니다. 예를 들어 같은 형식의 버퍼를 두 장 통째로 둔다면 화면 데이터만 30,000바이트입니다. 화면을 작은 구역으로 나누어 전송하는 구현은 전체 프레임 버퍼가 아예 필요하지 않을 수도 있습니다. 따라서 화면 해상도만 보고 메모리 요구량을 확정하지 마세요.
내부 RAM이 부족할 때만 외부 SRAM을 선택합니다
RAM(Random Access Memory)은 실행 중 바뀌는 데이터를 보관하는 메모리입니다. SRAM(Static RAM)은 그중 전원이 유지되는 동안 데이터를 보관하는 한 종류입니다. 예를 들어 256 Kbit 외부 SRAM은 256 × 1,024 ÷ 8 = 32,768바이트, 즉 32 KiB를 제공합니다. 15,000바이트짜리 단일 프레임은 용량상 들어가지만, 용량만 맞는다고 바로 표시 속도와 전송 경로까지 맞는 것은 아닙니다.
외부 SRAM을 SPI(Serial Peripheral Interface)로 연결한다면, 화면을 그리는 코드가 데이터를 내부 RAM 대신 외부 칩에 쓰고 다시 읽을 수 있어야 합니다. SPI는 클록선과 데이터선, 장치를 고르는 칩 선택(CS, Chip Select) 신호를 사용하는 직렬 통신 방식입니다. 화면 구동 칩이 외부 SRAM을 자동으로 읽어 주는 구조인지도 회로와 드라이버로 확인해야 합니다. 보통은 마이크로컨트롤러가 두 장치 사이의 데이터를 옮기며, 이때 전송 시간과 프로그램 구조가 달라집니다.
반대로 내부 RAM에서 실제로 할당할 수 있는 공간이 프레임 버퍼와 실행 중 필요한 다른 데이터까지 감당한다면, 외부 SRAM 칩을 빼는 설계도 검토할 수 있습니다. 단순히 MCU 사양표의 총 RAM에서 15,000만 빼지는 마세요. 스택(stack, 함수 실행 상태를 임시로 쌓는 공간), 통신 버퍼와 다른 작업의 최대 사용량까지 남겨야 합니다. 버퍼를 하나의 배열로 할당하는 구현이라면 그 배열이 들어갈 만큼 큰 할당 영역도 필요합니다.
화면 데이터와 글꼴 파일은 저장 공간이 다릅니다
프레임 버퍼는 지금 그릴 픽셀을 담는 임시 데이터입니다. 반면 글꼴 파일은 전원을 꺼도 남아 있어야 하므로 보통 플래시 메모리(flash memory, 전원이 없어도 내용을 유지하는 저장 소자)나 다른 비휘발성 저장소에 둡니다. 화면용 SRAM을 생략할 수 있다고 해서 글꼴 저장용 플래시까지 필요 없는 것은 아닙니다.
제어 모듈에 글꼴을 보관할 온보드 플래시가 없다면, 별도의 SPI 플래시(SPI flash)에 글꼴을 저장하는 구성을 검토할 수 있습니다. 16 Mbit, 즉 약 2 MiB급 외부 플래시를 선택하는 사례가 있지만, 실제 글꼴 파일이 그 안에 들어가는지는 언어 범위와 파일 형식으로 계산해야 합니다. MiB(mebibyte)는 1,048,576바이트입니다. 반대로 제어 모듈의 기존 저장소가 충분하다면 외부 글꼴 플래시를 생략할 수 있습니다. 두 선택 모두 사용하는 소프트웨어가 글꼴을 어디에서 읽는지와 SPI 칩 선택선을 어떻게 설정하는지까지 맞춰야 합니다.
칩을 넣거나 뺄 때 회로·코드를 함께 확인합니다
- 화면 드라이버에서 실제 해상도, 픽셀당 비트 수, 한 줄의 저장 길이, 버퍼 장수와 화면 갱신 방식을 확인합니다. 1 bpp 단일 프레임이 아니면 위의 15,000바이트를 그대로 적용하지 않습니다.
- 빌드 결과와 실행 중 최대 메모리 사용량을 확인합니다. 내부 RAM이 충분하다면 내부 버퍼로 먼저 표시를 시험합니다. 부족하거나 다른 작업의 여유가 사라진다면 외부 SRAM을 검토합니다.
- 외부 칩을 쓴다면 칩 선택선과 메모리 주소 범위, 읽기·쓰기 시험, 화면까지 보내는 순서를 확인합니다. 전원 바로 옆의 디커플링 커패시터(decoupling capacitor)는 칩이 전류를 갑자기 쓸 때 전원 전압이 흔들리는 것을 줄이는 부품입니다.
- 외부 SRAM을 빼기로 했다면 펌웨어의 외부 메모리 접근도 없애거나 내부 버퍼로 바꿉니다. 해당 메모리만을 위해 놓인 부품은 회로도에서 연결 대상을 확인한 뒤에만 함께 생략합니다. 부품 번호 하나만 보고 커패시터나 별도 글꼴 저장용 플래시까지 삭제하지 않습니다.
- 화면 전체의 흰색·검은색·교차 무늬와 가장자리 좌표를 표시해 봅니다. 표시가 깨지면 버퍼 용량뿐 아니라 비트 순서, 한 줄의 저장 길이, SPI 전송과 화면 갱신 순서를 나누어 확인합니다.
메모리 계산은 부품을 선택하는 시작점입니다. 실제 코드가 그 저장 공간을 사용할 수 있는지와 전원을 껐다 켠 뒤에도 원하는 화면 갱신이 되는지까지 확인해야 설계를 확정할 수 있습니다.