문제
LCD 컨트롤러 없는 MCU로 480×272 화면을 돌려야 했던 기기
고객사는 사무실 책상에 둘 작은 날씨 표시 기기가 필요했습니다. 휴대폰을 열지 않고도 오늘 날씨와 다음 예보를 보려는 목적이었습니다.
그전까지 날씨를 보려면 휴대폰이나 PC에서 예보 화면을 따로 열어야 했습니다. 고객은 예보가 늘 켜져 있는 기기를 원했고, 부품값은 낮게 잡았습니다.
이 기기의 MCU(STM32F401)에는 LCD 컨트롤러가 없었습니다. 480×272 화면에 픽셀을 보내려면 GPIO를 직접 움직여야 했습니다. C 코드로 GPIO를 다루면 LCD 클럭을 충분히 올리지 못했습니다.
기상청 예보 응답은 시간대별 항목이 길게 이어지는 JSON입니다. MCU의 RAM에 한 번에 담기 어려운 크기였습니다.
그래서 화면 구동과 데이터 수신을 나눠 풀기로 했습니다.
해결
WiFi 모듈 분리와 어셈블리 LCD 구동
인터넷 통신과 화면 출력을 서로 다른 부품에 나눴습니다. MCU는 받은 데이터를 풀어 화면에 그리는 일을 맡습니다.
- WiFi 모듈 분리: ESP-01이 인터넷 통신을 맡습니다. MCU와는 AT 명령으로 주고받고, UART DMA로 받습니다.
- 조각 수신: 기상청 응답을 조각으로 받아 플래시에 저장한 뒤 파싱합니다.
- LCD 직접 구동: 8080 병렬 LCD에 픽셀을 보낼 때 ARM 어셈블리로 GPIO를 직접 다룹니다.
- 작업 우선순위: 화면 출력과 버튼 입력을 통신·파싱보다 먼저 처리합니다.
- 화면 구성: 위에는 현재 기온과 날짜·시각을 크게 띄웁니다. 아래에는 3시간 간격 예보 8칸에 아이콘·기온·강수확률을 둡니다.
- 보드: 회로와 PCB를 OrCAD로 설계해 버튼 셋과 리셋 버튼을 달았습니다. 버튼으로 다음 날 예보를 넘겨 봅니다.

LCD 컨트롤러 없이 어셈블리로 화면을 그렸습니다
MCU에 LCD 컨트롤러가 없어 픽셀마다 GPIO를 움직여야 했습니다. 픽셀 전송 부분을 C에서 ARM 어셈블리로 바꿨습니다. 컨트롤러가 있는 MCU로 바꾸면 보드를 처음부터 다시 설계해야 했습니다. 명령을 직접 짜서 같은 MCU로 LCD 클럭을 두 배로 올렸습니다.
WiFi를 별도 모듈에 맡겼습니다
ESP-01이 인터넷 연결을 맡고, MCU는 AT 명령으로 결과만 받습니다. WiFi 연결과 통신 처리를 MCU에 올리면 화면 구동에 쓸 시간과 메모리가 줄어듭니다. ESP-01은 값이 싸고 AT 명령만으로 붙일 수 있어 보드에 얹기 쉬웠습니다.
응답을 조각으로 받아 플래시에 저장했습니다
기상청 응답을 한 번에 메모리에 담지 않고 나눠 받았습니다. 받은 조각은 플래시에 저장한 뒤 파싱합니다. 응답 전체를 RAM에 올리면 화면을 그리는 데 쓸 메모리가 모자랍니다. 플래시에 먼저 쌓아 두면 파싱 중에 통신이 끊겨도 받은 부분은 남습니다.
결과
어셈블리로 빨라진 LCD 구동과 한 화면에 모인 예보
시제품에서는 기상청 예보를 받아 현재 기온·시각과 3시간 간격 예보 8칸을 띄우는 것을 확인했습니다.
| 항목 | 이전 | 이후 | 변화 | 측정 기준 |
|---|---|---|---|---|
| LCD 픽셀 클럭 | 3MHz | 6MHz | 2배 | 개발 기록 |