[태그:] STM32

  • STM32와 RP2040 차이 완벽 정리: 키보드 MCU 구조와 성능 비교

    STM32와 RP2040 차이 완벽 정리: 키보드 MCU 구조와 성능 비교

    LINK&TEM GUIDE

    STM32와 RP2040 차이

    키보드 MCU의 성능·구조·펌웨어 환경은 무엇이 다를까?

    📌 핵심 요약
    • STM32는 하나의 칩이 아니라 성능과 기능이 다른 여러 MCU 제품군을 통칭하는 이름입니다.
    • RP2040은 Raspberry Pi가 설계한 듀얼 코어 Cortex-M0+ 기반의 단일 MCU 모델입니다.
    • STM32는 저전력·USB·무선·고성능 등 선택지가 넓고, RP2040은 단순한 제품 구성과 높은 접근성이 장점입니다.
    • RP2040은 프로그램을 외부 플래시 메모리에 저장하지만, 대부분의 STM32는 칩 내부 플래시를 사용합니다.
    • 키보드에서는 단순한 클럭 수보다 USB 지원, GPIO 수, 펌웨어 호환성, 소비전력과 회로 구성이 더 중요합니다.

    기계식 키보드의 기판이나 QMK 펌웨어 정보를 살펴보면 STM32RP2040이라는 이름을 자주 볼 수 있습니다. 두 칩 모두 키 입력을 읽고, 레이어와 매크로를 처리하며, USB를 통해 PC에 입력 정보를 전달하는 MCU로 사용할 수 있습니다.

    겉으로 보면 RP2040은 듀얼 코어와 높은 클럭을 갖추고 있어 무조건 더 좋은 칩처럼 보일 수 있습니다. 반대로 STM32는 오랫동안 다양한 키보드에 사용된 만큼 안정성과 호환성이 더 뛰어난 것처럼 느껴질 수 있습니다.

    하지만 두 이름을 숫자만으로 비교해서는 정확한 차이를 알기 어렵습니다. RP2040은 하나의 구체적인 MCU지만, STM32는 수많은 제품군을 포함하는 매우 넓은 플랫폼이기 때문입니다. 어떤 STM32를 비교 대상으로 선택하느냐에 따라 성능과 메모리, USB 기능, 소비전력이 크게 달라집니다.

    이번 글에서는 단순히 어느 쪽이 더 빠른지를 판단하는 것이 아니라, 두 MCU의 구조와 메모리 방식, 주변장치, 개발 환경 그리고 실제 키보드에서의 차이를 중심으로 살펴보겠습니다.


    1. STM32와 RP2040은 모두 MCU다

    STM32와 RP2040은 모두 MCU, 즉 Microcontroller Unit에 해당합니다. MCU는 CPU 코어뿐만 아니라 메모리, GPIO, 타이머, 통신 장치와 같은 주변 기능을 하나의 칩 안에 모아 놓은 소형 컴퓨터입니다.

    일반적인 PC의 CPU는 운영체제와 여러 프로그램을 동시에 실행하는 데 초점을 맞춥니다. 반면 MCU는 키 입력 감지, 센서 측정, 모터 제어처럼 정해진 작업을 빠르고 반복적으로 처리하는 데 적합합니다.

    키보드에서 MCU는 매트릭스의 행과 열을 계속 확인하고, 눌린 스위치를 찾아낸 뒤 디바운스 처리를 수행합니다. 이후 현재 레이어와 키맵을 확인하여 Keycode를 결정하고, 그 결과를 USB HID 리포트 형태로 PC에 전달합니다.

    키보드 MCU가 반복하는 주요 작업
    • 키보드 매트릭스의 행과 열 스캔
    • 스위치 접점의 디바운스 처리
    • 레이어와 Keycode 확인
    • 매크로와 조합키 처리
    • RGB LED 및 상태 표시등 제어
    • USB 또는 무선 연결을 통한 입력 전송

    따라서 STM32와 RP2040을 비교할 때는 단순히 CPU 속도만 보는 것보다, 키보드가 요구하는 기능을 얼마나 안정적으로 지원하는지를 함께 살펴봐야 합니다.

    2. STM32는 특정 칩이 아니라 제품군이다

    가장 먼저 알아야 할 점은 STM32가 하나의 MCU 모델명이 아니라는 것입니다. STM32는 STMicroelectronics가 제공하는 32비트 Arm Cortex-M 기반 MCU 제품군 전체를 가리킵니다.

    STM32 안에는 비교적 단순하고 저렴한 제품부터 높은 연산 성능과 대용량 메모리를 갖춘 제품까지 다양한 시리즈가 포함됩니다. Cortex-M0 또는 M0+ 기반의 보급형 제품도 있고, Cortex-M3·M4·M7·M33처럼 더 높은 성능과 추가 기능을 제공하는 제품도 있습니다.

    예를 들어 키보드에서 많이 볼 수 있는 STM32F103은 Cortex-M3 코어를 사용하는 MCU입니다. 반면 일부 저가형 기판에는 더 단순한 STM32F0 계열이 사용될 수 있고, 고성능 임베디드 장치에는 STM32F4나 STM32H7처럼 훨씬 강력한 제품이 사용됩니다.

    💡 중요한 비교 기준

    “STM32와 RP2040 중 무엇이 더 빠른가?”라는 질문만으로는 정확한 답을 내리기 어렵습니다. STM32F0, STM32F1, STM32F4처럼 비교 대상에 따라 CPU 코어와 클럭, 메모리 구성이 달라지기 때문입니다.

    즉 STM32의 가장 큰 특징은 선택지가 매우 넓다는 것입니다. 제조사는 필요한 GPIO 수, USB 기능, 소비전력, 메모리 용량과 가격에 맞춰 적절한 STM32 모델을 선택할 수 있습니다.

    구분 주요 특징
    STM32F0 비교적 단순한 Cortex-M0 기반 제품군으로 비용과 기본 기능의 균형을 중시
    STM32F1 Cortex-M3 기반의 대표적인 범용 제품군으로 다양한 임베디드 장치에서 사용
    STM32F4 Cortex-M4와 DSP·부동소수점 기능을 활용할 수 있는 고성능 제품군
    STM32L·U 배터리 기반 장치를 고려한 저전력 중심 제품군
    STM32H 복잡한 연산과 고속 주변장치를 위한 고성능 제품군

    물론 모든 STM32가 키보드에 적합한 것은 아닙니다. 필요한 핀 수가 부족할 수도 있고, USB 장치 기능을 지원하지 않을 수도 있으며, 성능에 비해 가격과 회로 복잡도가 지나치게 높을 수도 있습니다.

    그래서 실제 키보드 기판에서는 무조건 가장 강력한 STM32를 선택하지 않습니다. 매트릭스 크기, RGB LED 수, USB 연결 방식, 무선 기능과 펌웨어 용량을 고려해 필요한 수준의 MCU를 선택합니다.

    3. RP2040은 하나의 구체적인 MCU다

    RP2040은 Raspberry Pi가 직접 설계한 범용 MCU입니다. STM32처럼 수많은 세부 모델이 묶인 이름이 아니라, 비교적 명확한 하나의 칩 구성을 가리킵니다.

    RP2040에는 Arm Cortex-M0+ 코어가 두 개 들어 있으며, 최대 133MHz로 동작하도록 설계되었습니다. SRAM은 총 264KB이며, GPIO와 타이머, ADC, USB 장치 및 호스트 기능 등을 제공합니다.

    RP2040에서 특히 눈에 띄는 부분은 듀얼 코어PIO입니다. 듀얼 코어는 작업을 두 코어에 나눌 수 있게 해주며, PIO는 일반적인 주변장치만으로 처리하기 어려운 디지털 통신 동작을 직접 구성할 수 있게 해주는 기능입니다.

    RP2040의 대표적인 특징
    • 듀얼 코어 Arm Cortex-M0+ 구조
    • 최대 133MHz 동작 클럭
    • 264KB 온칩 SRAM
    • 외부 QSPI 플래시 메모리 사용
    • USB 1.1 장치 및 호스트 지원
    • 사용자가 동작을 구성할 수 있는 PIO 블록 제공

    RP2040은 Raspberry Pi Pico를 통해 널리 알려졌습니다. 비교적 저렴한 개발 보드와 잘 정리된 공식 문서, C/C++ SDK, MicroPython 환경 덕분에 입문자도 쉽게 접근할 수 있었습니다.

    이후 RP2040은 개발 보드뿐만 아니라 커스텀 키보드, 매크로 패드, 컨트롤러와 각종 소형 전자기기에 사용되기 시작했습니다. QMK와 KMK 같은 키보드 펌웨어에서도 활용할 수 있어 키보드 제작자에게도 익숙한 MCU가 되었습니다.

    주의할 점

    RP2040이 듀얼 코어라고 해서 키보드의 모든 동작이 자동으로 두 배 빨라지는 것은 아닙니다. 펌웨어가 두 번째 코어를 실제로 활용하도록 설계되어야 하며, 일반적인 키 매트릭스 스캔과 USB 입력 처리는 한 개의 코어만으로도 충분한 경우가 많습니다.

    4. CPU 코어와 클럭은 어떻게 다를까?

    RP2040은 Cortex-M0+ 코어 두 개를 최대 133MHz로 구동합니다. 반면 STM32는 선택한 모델에 따라 코어의 종류와 개수, 최대 클럭이 모두 달라집니다.

    보급형 STM32F0는 Cortex-M0 기반으로 RP2040보다 낮은 클럭을 사용하는 경우가 많습니다. STM32F103처럼 Cortex-M3를 사용하는 제품은 명령 처리 구조와 인터럽트 기능이 다르며, STM32F4 이상에서는 Cortex-M4나 더 강력한 코어를 사용할 수 있습니다.

    항목 STM32 RP2040
    제품 범위 다양한 MCU 제품군 하나의 구체적인 MCU
    CPU 코어 모델에 따라 Cortex-M0부터 M7·M33 등 다양 듀얼 Cortex-M0+
    동작 클럭 모델별로 크게 다름 최대 133MHz
    코어 수 대부분 싱글 코어, 일부 듀얼 코어 듀얼 코어
    선택 방식 용도에 맞는 모델을 선택 동일한 기본 사양을 기준으로 설계

    클럭 수치만 보면 RP2040이 일부 보급형 STM32보다 빠른 것은 사실입니다. 그러나 서로 다른 Cortex-M 코어는 같은 클럭에서도 명령 처리 능력과 지원 기능이 다를 수 있습니다.

    또한 키보드는 고성능 연산을 계속 수행하는 장치가 아닙니다. 대부분의 시간에는 매트릭스를 스캔하고, 짧은 입력 이벤트를 처리하며, USB 리포트를 일정한 주기로 전송합니다. 따라서 일반 키보드에서는 MCU 클럭이 높다고 해서 사용자가 체감하는 입력 지연이 같은 비율로 줄어들지는 않습니다.

    💡 키보드에서는 무엇이 더 중요할까?

    키보드의 실제 반응 속도는 MCU의 최대 클럭 하나로 결정되지 않습니다. 매트릭스 스캔 주기, 디바운스 알고리즘, USB Polling Rate, 펌웨어 구조와 무선 연결 지연이 함께 영향을 줍니다.

    5. 메모리 구조에서 큰 차이가 난다

    STM32와 RP2040의 차이를 이해할 때 중요한 부분이 프로그램 저장 방식입니다. 대부분의 STM32 MCU는 펌웨어를 저장할 수 있는 플래시 메모리를 칩 내부에 포함합니다.

    개발자가 QMK와 같은 펌웨어를 빌드하여 기록하면, 생성된 프로그램은 STM32 내부 플래시에 저장됩니다. 전원이 꺼졌다가 다시 켜져도 내부 플래시에 기록된 프로그램이 실행됩니다.

    반면 RP2040에는 일반적인 프로그램 저장용 플래시 메모리가 칩 내부에 포함되어 있지 않습니다. 대신 기판에 별도의 QSPI 플래시 메모리를 연결하고, 여기에 펌웨어를 저장합니다.

    프로그램 저장 방식 비교
    • STM32: 대부분의 모델이 내부 플래시에 펌웨어 저장
    • RP2040: 기판에 연결된 외부 QSPI 플래시에 펌웨어 저장
    • 공통점: 실행 중 필요한 데이터는 SRAM에 올려 처리
    • 실제 차이: 회로 구성과 펌웨어 기록 방식에서 차이가 발생

    RP2040의 외부 플래시 구조는 기판에 별도의 메모리 칩이 필요하다는 단점이 있지만, 설계자가 필요한 저장 용량을 비교적 유연하게 선택할 수 있다는 장점도 있습니다.

    예를 들어 복잡한 RGB 효과, 다양한 레이어, 대용량 기능을 넣어 펌웨어 크기가 커졌다면 더 큰 외부 플래시를 선택할 수 있습니다. 다만 펌웨어와 부트로더, 기판 설계가 해당 용량을 정상적으로 지원해야 합니다.

    STM32는 모델마다 내부 플래시와 SRAM 용량이 정해져 있습니다. 따라서 키보드 제조사는 펌웨어 크기와 필요한 기능을 예상하고 충분한 메모리를 가진 모델을 선택해야 합니다.

    Part 1 정리

    STM32는 성능과 기능이 다른 여러 MCU를 포함하는 넓은 제품군이고, RP2040은 듀얼 Cortex-M0+ 코어와 외부 플래시 구조를 사용하는 하나의 구체적인 MCU입니다. 따라서 두 이름을 단순한 클럭 수치만으로 비교해서는 안 됩니다. 다음에서는 GPIO와 PIO, USB 기능, QMK 펌웨어 환경, 소비전력과 실제 키보드에서의 체감 차이를 이어서 살펴보겠습니다.

    6. GPIO와 PIO는 무엇이 다를까?

    키보드 MCU에서 매우 중요한 기능 중 하나가 GPIO입니다. GPIO는 General Purpose Input/Output의 약자로, MCU가 외부 부품과 신호를 주고받을 때 사용하는 범용 입출력 핀입니다.

    키보드 매트릭스에서는 여러 GPIO 핀을 행과 열에 연결합니다. MCU는 한쪽 핀에 신호를 출력하고 다른 쪽 핀의 상태를 읽으면서 어떤 스위치가 눌렸는지 확인합니다. 상태 LED, 로터리 인코더, OLED 화면, RGB LED 제어에도 GPIO가 사용됩니다.

    STM32와 RP2040 모두 충분한 GPIO를 제공하지만, 실제 사용 가능한 핀 수는 칩 패키지와 기판 설계에 따라 달라집니다. 같은 STM32 시리즈라도 핀 수가 적은 패키지와 많은 패키지가 존재하며, 일부 핀은 USB·클럭·디버깅 기능과 함께 사용되기도 합니다.

    GPIO를 확인할 때 볼 항목
    • 기판에서 실제로 사용할 수 있는 핀의 개수
    • 핀마다 지원하는 입력·출력 및 대체 기능
    • ADC, PWM, UART, SPI, I²C와 공유되는지 여부
    • 부팅이나 디버깅에 예약된 핀이 있는지 여부
    • 핀의 허용 전압과 출력 전류 조건

    RP2040의 독특한 기능은 PIO, Programmable I/O입니다. PIO는 CPU가 모든 타이밍을 직접 계산하지 않아도, 작은 상태 머신이 정해진 입출력 동작을 반복하도록 구성할 수 있는 기능입니다.

    일반 MCU는 UART, SPI, I²C처럼 미리 설계된 주변장치를 사용합니다. 그러나 특별한 통신 규격이나 매우 정확한 신호 타이밍이 필요하다면 기본 주변장치만으로 구현하기 어려울 수 있습니다. RP2040의 PIO는 이런 상황에서 사용자가 직접 간단한 입출력 동작을 정의할 수 있게 합니다.

    키보드에서는 PIO를 반드시 사용해야 하는 것은 아닙니다. 일반적인 매트릭스 스캔과 USB HID 처리에는 기본 GPIO와 타이머만으로도 충분합니다. 다만 주소 지정형 LED, 특수 통신 장치, 독특한 입력 확장 회로를 제어할 때 PIO가 유용하게 활용될 수 있습니다.

    💡 PIO가 있다고 무조건 더 좋은 것은 아니다

    PIO는 일반적인 GPIO를 대체하는 기능이 아니라, 정밀한 신호 생성과 특수 통신을 보조하는 장치입니다. 평범한 키보드에서는 PIO보다 펌웨어 완성도와 핀 배치가 더 중요할 수 있습니다.

    7. USB 기능은 키보드에서 왜 중요할까?

    유선 키보드는 MCU가 USB 장치로 동작해야 합니다. 사용자가 케이블을 연결하면 MCU는 PC와 USB 통신을 시작하고, 자신이 어떤 장치인지 알리는 디스크립터를 전달합니다.

    PC는 이 정보를 바탕으로 해당 장치를 키보드, 마우스, 미디어 컨트롤러 등으로 인식합니다. 이후 MCU는 눌린 키 정보를 HID 리포트로 만들어 USB를 통해 전송합니다.

    RP2040은 USB 1.1 컨트롤러와 PHY를 포함하고 있어 별도의 USB 통신 칩 없이 장치 또는 호스트 기능을 구현할 수 있습니다. 키보드에서는 대부분 USB 장치 모드로 사용됩니다.

    STM32는 모델마다 USB 지원 범위가 다릅니다. 어떤 제품은 USB Full-Speed 장치 기능을 제공하지만, 일부 저가형 모델은 USB 주변장치가 없을 수 있습니다. 고급 제품군에서는 USB High-Speed 또는 추가적인 USB 기능을 지원하는 모델도 존재합니다.

    항목 STM32 RP2040
    USB 지원 모델마다 다르므로 데이터시트 확인 필요 USB 1.1 컨트롤러와 PHY 내장
    키보드 사용 USB 지원 모델이면 HID 장치 구현 가능 USB HID 키보드 구현 가능
    확인 요소 USB 장치 지원, 핀 배치, 클럭 구성 USB 데이터 핀 배치와 외부 회로

    키보드의 Polling Rate는 USB 컨트롤러의 최고 성능만으로 결정되지 않습니다. 펌웨어가 얼마나 자주 HID 리포트를 준비하는지, 엔드포인트 설정이 어떻게 되어 있는지, 매트릭스 스캔과 디바운스가 얼마나 빠르게 끝나는지가 함께 영향을 줍니다.

    따라서 1,000Hz Polling Rate를 지원한다고 해도 모든 키 입력이 정확히 1ms 안에 PC로 전달된다는 뜻은 아닙니다. 사용자가 키를 누른 순간과 다음 매트릭스 스캔 시점 사이의 대기, 디바운스 시간, USB 전송 대기가 더해질 수 있습니다.

    8. QMK 펌웨어에서는 어떤 차이가 있을까?

    QMK Firmware는 다양한 키보드 MCU와 기판을 지원합니다. STM32 기반 기판과 RP2040 기반 기판 모두 QMK를 사용할 수 있지만, 내부에서 사용되는 하드웨어 추상화 계층과 빌드 설정에는 차이가 있습니다.

    STM32 기반 QMK 키보드는 주로 ChibiOS 환경을 활용합니다. 기판 정의에는 사용 중인 STM32 모델, 클럭, USB 설정, GPIO 핀과 부트로더 방식 등이 포함됩니다.

    RP2040 기반 기판 역시 QMK에서 사용할 수 있으며, 해당 MCU에 맞는 드라이버와 설정이 필요합니다. 개발자는 단순히 MCU 이름만 변경하는 것이 아니라, 핀 번호와 플래시 구성, 부트로더, USB 설정까지 기판에 맞춰 지정해야 합니다.

    QMK 기판 설정에서 달라질 수 있는 부분
    • MCU와 보드 플랫폼 설정
    • 행·열 GPIO 핀 번호
    • 부트로더 종류와 진입 방식
    • 플래시 메모리와 EEPROM 에뮬레이션 방식
    • USB 드라이버와 클럭 설정
    • RGB, OLED, 인코더 등 주변장치 드라이버

    사용자 입장에서는 정상적으로 완성된 펌웨어가 들어간 키보드라면 MCU 차이를 크게 느끼지 못할 수 있습니다. 키맵 변경, 레이어 전환, 매크로, 미디어 키 같은 일반적인 QMK 기능은 두 플랫폼 모두에서 구현할 수 있기 때문입니다.

    차이는 주로 개발자와 기판 설계자에게 더 크게 나타납니다. 기존 오픈소스 기판을 참고하기 쉬운지, 필요한 드라이버가 이미 지원되는지, 디버깅 환경이 익숙한지에 따라 개발 난이도가 달라집니다.

    펌웨어 호환성을 먼저 확인해야 하는 이유

    MCU의 성능이 충분하더라도 사용하려는 LED 드라이버, 무선 모듈, 디스플레이 또는 부트로더가 펌웨어에서 제대로 지원되지 않으면 개발 시간이 크게 늘어날 수 있습니다.

    9. 부트로더와 펌웨어 기록 방식

    부트로더는 MCU가 시작될 때 펌웨어를 실행하거나 새로운 펌웨어를 기록할 수 있도록 도와주는 작은 프로그램입니다. 키보드 사용자는 부트로더 모드에 진입한 뒤 QMK Toolbox 같은 프로그램이나 명령어를 사용해 펌웨어를 업데이트할 수 있습니다.

    STM32는 모델과 기판 설계에 따라 DFU, STM32duino 계열 부트로더 또는 별도의 커스텀 부트로더를 사용할 수 있습니다. 일부 STM32에는 제조사가 제공하는 시스템 부트로더가 ROM에 포함되어 있어 특정 핀 상태나 명령을 통해 진입할 수 있습니다.

    RP2040은 BOOTSEL 방식을 통해 USB 대용량 저장장치처럼 표시되는 부트 모드를 사용할 수 있습니다. BOOTSEL 버튼을 누른 상태에서 연결하면 PC에 저장장치가 나타나고, UF2 형식의 펌웨어 파일을 복사해 기록할 수 있습니다.

    구분 STM32 RP2040
    대표 진입 방식 DFU, 시스템 부트로더, 커스텀 부트로더 BOOTSEL 기반 USB 부트
    파일 기록 DFU 도구 또는 전용 플래싱 프로그램 사용 UF2 파일을 저장장치에 복사하는 방식 사용 가능
    사용 편의성 기판과 부트로더에 따라 절차가 달라짐 일반 사용자도 비교적 이해하기 쉬움

    RP2040의 UF2 방식은 초보자에게 특히 편리합니다. 별도의 드라이버나 복잡한 프로그램 없이 파일 복사 방식으로 펌웨어를 기록할 수 있기 때문입니다.

    하지만 완제품 키보드에서는 제조사가 부트 버튼을 외부에 노출하지 않을 수도 있습니다. 이 경우 특정 키 조합, QMK의 Reset Keycode 또는 기판의 리셋 패드를 사용해 부트로더로 진입해야 합니다.

    10. EEPROM은 어떻게 처리할까?

    키보드에서 EEPROM은 사용자가 변경한 설정을 전원이 꺼진 뒤에도 유지하는 데 사용됩니다. VIA에서 변경한 키맵, 기본 레이어, RGB 밝기와 같은 설정이 대표적입니다.

    그러나 모든 MCU가 별도의 물리적 EEPROM을 내부에 포함하는 것은 아닙니다. 이 경우 펌웨어는 플래시 메모리의 일부를 EEPROM처럼 사용하는 에뮬레이션 방식을 사용할 수 있습니다.

    STM32 역시 모델에 따라 실제 EEPROM 제공 여부가 다르며, 많은 QMK 기판은 내부 플래시의 일부 또는 외부 EEPROM을 활용합니다. RP2040은 외부 QSPI 플래시의 일부 영역을 설정 저장 용도로 사용할 수 있습니다.

    💡 EEPROM이라는 이름에 주의

    QMK 설정에서 EEPROM이라고 표현하더라도 실제 하드웨어가 반드시 독립된 EEPROM 칩이라는 뜻은 아닙니다. 내부 플래시 또는 외부 플래시의 일부를 소프트웨어적으로 EEPROM처럼 사용할 수 있습니다.

    플래시는 데이터를 기록할 때 일정 크기의 영역을 지우고 다시 써야 하므로, 일반 RAM처럼 무제한으로 빠르게 변경하는 용도에는 적합하지 않습니다. 펌웨어는 불필요한 쓰기 횟수를 줄이고 저장 영역을 안정적으로 관리해야 합니다.

    사용자가 키맵을 한 번 변경하는 정도로 수명이 문제가 되는 경우는 드뭅니다. 다만 펌웨어 오류로 매 스캔마다 설정을 기록하도록 만들면 플래시 마모가 빨라질 수 있으므로 개발 단계에서 주의해야 합니다.

    11. 소비전력과 무선 키보드 적합성

    유선 키보드는 USB에서 지속적으로 전원을 공급받기 때문에 MCU 소비전력이 큰 문제가 되지 않는 경우가 많습니다. 하지만 배터리를 사용하는 무선 키보드에서는 소비전력이 사용 시간을 결정하는 핵심 요소가 됩니다.

    STM32 제품군에는 저전력 동작을 중심으로 설계된 시리즈가 존재합니다. 깊은 절전 모드, 빠른 복귀, 다양한 클럭 제어 기능을 활용하면 배터리 장치에 적합한 설계를 만들 수 있습니다.

    RP2040도 클럭을 조절하고 일부 기능을 정지해 소비전력을 줄일 수 있지만, 저전력 무선 장치를 목적으로 할 때는 전용 저전력 MCU와 비교해야 합니다. 특히 RP2040 자체에는 Bluetooth 또는 2.4GHz 무선 기능이 내장되어 있지 않습니다.

    STM32 역시 대부분의 일반 모델에는 무선 기능이 없지만, STM32WB처럼 Bluetooth와 무선 기능을 통합한 별도 제품군이 존재합니다. 반면 RP2040 기반 무선 키보드는 일반적으로 외부 무선 칩이나 모듈을 추가해야 합니다.

    항목 STM32 RP2040
    저전력 선택지 저전력 특화 제품군을 선택할 수 있음 클럭과 절전 모드 최적화 필요
    무선 내장 일부 무선 통합 제품군 존재 기본 RP2040에는 무선 기능 없음
    배터리 키보드 모델 선택과 설계에 따라 유리할 수 있음 외부 무선 모듈과 전력 최적화가 중요

    무선 키보드의 사용 시간은 MCU 하나만으로 결정되지 않습니다. 무선 칩, RGB LED, 배터리 용량, 스캔 주기, 절전 진입 시간, 대기 중 전류와 펌웨어 최적화가 모두 영향을 줍니다.

    12. 실제 키보드 성능은 어느 쪽이 더 좋을까?

    일반적인 유선 키보드라면 STM32와 RP2040 모두 충분한 성능을 제공합니다. 매트릭스 스캔, 디바운스, 레이어, 매크로, USB HID 전송은 비교적 가벼운 작업이기 때문입니다.

    RP2040은 높은 클럭, 넉넉한 SRAM, 듀얼 코어 덕분에 복잡한 기능을 추가할 여유가 큽니다. 많은 RGB LED, 디스플레이 애니메이션, 추가 입력 장치 또는 실험적인 기능을 넣을 때 장점이 될 수 있습니다.

    STM32는 필요한 성능과 기능에 맞춰 정확한 모델을 선택할 수 있다는 장점이 있습니다. 단순한 키보드에는 저렴한 제품을, 저전력 무선 기기에는 저전력 제품을, 복잡한 장치에는 고성능 제품을 선택할 수 있습니다.

    STM32가 잘 맞는 경우
    • 목적에 맞는 MCU를 세밀하게 선택할 때
    • 저전력 설계가 중요한 경우
    • 산업용 주변장치와 다양한 통신 기능이 필요할 때
    • 기존 STM32 개발 환경을 활용할 때
    RP2040이 잘 맞는 경우
    • 높은 접근성과 단순한 제품 구성을 원할 때
    • UF2 방식의 편리한 펌웨어 기록이 필요할 때
    • 넉넉한 SRAM과 높은 클럭이 필요할 때
    • PIO를 이용한 특수 입출력을 구현할 때

    사용자가 느끼는 키보드 품질은 MCU 이름보다 전체 설계에 더 큰 영향을 받습니다. 같은 RP2040을 사용해도 펌웨어가 비효율적이면 입력 지연이 늘어날 수 있고, 낮은 클럭의 STM32라도 최적화가 잘되어 있으면 안정적인 성능을 낼 수 있습니다.

    스위치 입력이 PC에 전달되기까지는 매트릭스 스캔, 디바운스, Keycode 처리, HID 리포트 생성, USB 전송 과정이 이어집니다. 이 중 어느 한 단계가 느리면 고성능 MCU의 장점이 제대로 나타나지 않을 수 있습니다.

    결론적으로 MCU만 보고 키보드를 평가하면 안 된다

    MCU는 중요한 부품이지만 스캔 주기, 펌웨어, USB 설정, 회로 품질과 무선 최적화가 함께 완성되어야 좋은 키보드가 됩니다.

    13. STM32와 RP2040 차이 한눈에 보기

    비교 항목 STM32 RP2040
    정체 수많은 MCU가 포함된 제품군 하나의 구체적인 MCU
    CPU 구조 제품에 따라 Cortex-M 계열이 다양 듀얼 Cortex-M0+
    최대 클럭 모델별로 다름 기본 사양 최대 133MHz
    프로그램 저장 대부분 내부 플래시 외부 QSPI 플래시
    특수 기능 제품별 다양한 주변장치와 저전력 기능 PIO와 듀얼 코어
    USB 모델별 지원 여부 확인 필요 USB 1.1 컨트롤러와 PHY 내장
    펌웨어 기록 DFU 등 기판별 방식 사용 BOOTSEL과 UF2 방식 사용 가능
    저전력 선택 저전력 특화 제품군 선택 가능 외부 회로와 펌웨어 최적화 중요
    키보드 활용 상용·커스텀 기판에서 폭넓게 사용 커스텀 키보드와 개발 보드에서 활용 증가

    14. 자주 묻는 질문

    Q. RP2040이 STM32보다 무조건 빠른가요?

    아닙니다. STM32는 매우 다양한 제품군이므로 어떤 모델과 비교하는지에 따라 결과가 달라집니다. 일부 보급형 STM32보다 RP2040의 클럭과 SRAM이 클 수 있지만, 고성능 STM32는 훨씬 강력한 CPU와 주변장치를 제공할 수 있습니다.

    Q. 듀얼 코어면 키보드 입력 속도가 두 배 빨라지나요?

    그렇지 않습니다. 펌웨어가 두 코어를 활용하도록 작성되어야 하며, 일반적인 매트릭스 스캔과 USB HID 처리에는 한 코어만으로도 충분합니다. 입력 속도는 디바운스와 스캔 주기, USB 설정에도 영향을 받습니다.

    Q. QMK 키보드에는 어느 MCU가 더 좋나요?

    두 플랫폼 모두 사용할 수 있습니다. 필요한 GPIO 수, USB 지원, 메모리 용량, QMK 드라이버 지원과 기판 설계 경험을 기준으로 선택하는 것이 좋습니다.

    Q. RP2040에는 EEPROM이 있나요?

    독립된 프로그램 저장용 내부 플래시나 일반적인 물리 EEPROM은 없습니다. 기판에 연결된 외부 QSPI 플래시의 일부를 설정 저장 영역으로 활용할 수 있습니다.

    Q. 무선 키보드에는 어느 쪽이 적합한가요?

    특정 이름만으로 판단하기 어렵습니다. 저전력 STM32 제품군은 배터리 장치에 유리할 수 있지만, 무선 통합 여부와 외부 무선 칩, 펌웨어 절전 최적화를 함께 확인해야 합니다.

    Q. 키보드 구매 시 MCU 이름을 꼭 확인해야 하나요?

    참고할 수는 있지만 MCU 이름만으로 품질을 판단하기는 어렵습니다. 실제 Polling Rate, 입력 안정성, 펌웨어 지원, VIA·VIAL 호환성과 제조사의 업데이트 정책을 함께 확인하는 것이 좋습니다.

    15. 함께 보면 좋은 글

    16. 공식 자료

    17. 결론

    STM32와 RP2040은 모두 키보드 MCU로 사용할 수 있지만 출발점이 다릅니다. STM32는 다양한 성능과 기능을 가진 거대한 MCU 제품군이며, RP2040은 듀얼 Cortex-M0+ 코어와 PIO, 외부 플래시 구조를 갖춘 하나의 구체적인 칩입니다.

    STM32의 장점은 선택의 폭입니다. 가격, 성능, 소비전력, USB와 무선 기능에 맞춰 적절한 모델을 선택할 수 있습니다. 반면 RP2040은 비교적 단순한 제품 구성, 넉넉한 SRAM, 편리한 UF2 부트 방식과 PIO 기능이 강점입니다.

    일반적인 키보드에서는 두 플랫폼 모두 충분한 성능을 낼 수 있습니다. 따라서 어느 MCU가 더 우수한지를 단정하기보다는 해당 기판의 펌웨어 지원, 매트릭스 스캔 구조, USB 설정, 메모리 용량과 전력 설계를 함께 확인하는 것이 정확합니다.

    결국 좋은 키보드를 만드는 핵심은 가장 높은 클럭의 MCU를 선택하는 것이 아닙니다. 필요한 기능에 맞는 MCU를 고르고, 회로와 펌웨어를 안정적으로 설계하는 것이 더 중요합니다.

    Link&Tem 한 줄 정리

    STM32는 목적에 맞춰 선택하는 MCU 제품군이고, RP2040은 듀얼 코어와 PIO, 편리한 부트 방식을 하나의 칩에 담은 범용 MCU입니다.

    Sources
    • STMicroelectronics, STM32 32-bit Arm Cortex MCU 공식 제품 정보
    • Raspberry Pi, RP2040 공식 제품 페이지 및 데이터시트
    • Raspberry Pi, RP2040 Hardware Design 및 Microcontroller Documentation
    • QMK Firmware 공식 문서
  • MCU는 어떤 일을 할까? 키보드 입력을 처리하는 핵심 칩의 역할

    MCU는 어떤 일을 할까? 키보드 입력을 처리하는 핵심 칩의 역할

    LINK&TEM GUIDE

    MCU는 어떤 일을 할까?

    키 입력 감지부터 Keycode 처리와 USB 전송까지 키보드 컨트롤러의 역할

    📌 핵심 요약
    • MCU는 키보드 내부에서 펌웨어를 실행하는 작은 컴퓨터 역할을 합니다.
    • 키보드 매트릭스를 반복해서 스캔하며 어떤 스위치가 눌렸는지 확인합니다.
    • 감지한 위치를 Keycode로 변환하고 레이어, 매크로, 조합키 규칙을 처리합니다.
    • 처리가 끝난 입력은 USB 또는 무선 통신 규격에 맞는 리포트로 PC에 전달됩니다.
    • MCU의 성능뿐 아니라 GPIO 수, 플래시·RAM 용량, USB 지원 방식도 키보드 설계에 중요합니다.

    키보드에서 키를 누르면 스위치가 전기적으로 연결되고, 그 신호가 곧바로 문자로 바뀌어 PC에 전달된다고 생각하기 쉽습니다. 하지만 스위치는 자신이 어떤 글자인지 알지 못합니다. 스위치가 만들어내는 것은 특정 회로가 연결되었다는 단순한 전기적 변화뿐입니다.

    이 변화를 읽고, 어느 위치의 키가 눌렸는지 판단하고, 현재 레이어에서 어떤 기능을 실행해야 하는지 결정한 뒤, 컴퓨터가 이해할 수 있는 입력 데이터로 만들어 보내는 부품이 바로 MCU입니다.

    MCU는 Microcontroller Unit의 약자로, 프로세서와 메모리, 입출력 장치가 하나의 칩 안에 통합된 소형 제어 장치입니다. 키보드에서는 QMK와 같은 펌웨어를 실행하면서 매트릭스 스캔, 디바운스, Keycode 해석, LED 제어, USB 통신 등을 반복적으로 처리합니다.

    따라서 MCU를 이해하면 키보드 입력이 왜 단순한 스위치 연결만으로 끝나지 않는지, QMK 펌웨어가 어디에서 실행되는지, EEPROM과 플래시 메모리는 각각 무엇을 저장하는지, STM32와 RP2040 같은 칩의 차이가 실제 키보드에 어떤 영향을 주는지까지 하나의 흐름으로 이해할 수 있습니다.


    1. MCU는 키보드 안의 작은 컴퓨터다

    MCU를 가장 쉽게 설명하면 키보드 안에 들어 있는 작은 컴퓨터입니다. 일반적인 PC의 CPU처럼 명령어를 실행하지만, 문서 작성이나 영상 편집처럼 범용 작업을 수행하는 것이 아니라 키보드 제어에 필요한 작업을 빠르고 반복적으로 처리하도록 사용됩니다.

    MCU 내부에는 명령을 실행하는 CPU 코어, 펌웨어를 저장하는 플래시 메모리, 실행 중인 데이터를 보관하는 RAM, 외부 회로와 신호를 주고받는 GPIO, 시간을 측정하는 타이머, USB와 같은 통신 장치가 통합되어 있습니다.

    키보드 MCU에 들어 있는 대표 구성
    • CPU 코어 : 펌웨어의 명령어를 순서대로 실행
    • 플래시 메모리 : QMK 펌웨어와 기본 키맵을 저장
    • RAM : 현재 키 상태와 실행 중인 임시 데이터를 보관
    • GPIO : 키보드의 행과 열, LED, 로터리 엔코더 등을 연결
    • 타이머 : 스캔 주기, 디바운스, 탭·홀드 시간을 측정
    • 통신 장치 : USB, UART, SPI, I²C 등의 데이터 전송을 담당

    이 구성 요소들은 각각 따로 움직이는 것이 아니라 펌웨어의 지시에 따라 연결됩니다. 예를 들어 CPU 코어가 GPIO의 상태를 읽고, RAM에 저장된 이전 키 상태와 비교한 뒤, 새로운 입력이 발견되면 플래시에 저장된 키맵을 참고하여 어떤 Keycode를 처리할지 결정하는 방식입니다.

    일반적인 데스크톱 프로세서와 비교하면 MCU의 동작 속도와 메모리 용량은 작습니다. 하지만 키보드는 대규모 프로그램을 실행할 필요가 없기 때문에 중요한 것은 절대적인 연산 성능보다 입력을 일정한 주기로 안정적으로 처리하는 능력입니다.

    🔍 Link&Tem Insight

    MCU는 CPU만을 의미하지 않습니다. CPU 코어를 포함해 플래시, RAM, GPIO, 타이머, USB 컨트롤러 같은 주변 장치를 하나의 칩에 통합한 부품입니다. 키보드 PCB에서 MCU 하나가 여러 기능을 처리할 수 있는 이유도 이러한 통합 구조에 있습니다.

    2. 키보드가 켜지면 MCU에서 일어나는 일

    키보드를 USB 포트에 연결하거나 무선 키보드의 전원을 켜면 MCU는 저장된 펌웨어를 읽어 실행하기 시작합니다. 이 과정을 부팅 또는 초기화라고 부릅니다.

    초기화 단계에서는 MCU의 동작 클록을 설정하고, 키보드의 행과 열에 연결된 GPIO 방향을 지정하며, USB 통신 장치와 타이머를 준비합니다. EEPROM이나 별도의 비휘발성 저장 영역에 사용자 설정이 있다면 이 값도 불러옵니다.

    전원을 넣은 뒤의 기본 흐름
    1. MCU가 리셋 상태에서 시작합니다.
    2. 플래시 메모리에 저장된 펌웨어를 실행합니다.
    3. 클록, GPIO, 타이머와 통신 장치를 초기화합니다.
    4. 저장된 키맵 및 사용자 설정을 불러옵니다.
    5. USB 장치 정보를 PC에 전달하여 키보드로 인식시킵니다.
    6. 키보드 매트릭스 스캔을 반복하기 시작합니다.

    유선 USB 키보드라면 MCU는 자신이 어떤 종류의 장치인지 PC에 알려야 합니다. 이때 키보드는 일반적으로 USB HID 장치로 동작합니다. 운영체제가 장치를 정상적으로 인식하면 별도의 전용 드라이버를 설치하지 않아도 기본 키 입력을 받을 수 있습니다.

    초기화가 끝난 뒤에는 프로그램이 종료되지 않습니다. MCU는 전원이 꺼질 때까지 매트릭스를 읽고, 입력 변화를 확인하고, 필요한 기능을 실행하는 루프를 계속 반복합니다.

    💡 TIP

    키보드의 LED는 켜지지만 PC에서 입력 장치로 인식되지 않는다면 전원 공급은 되고 있어도 MCU의 펌웨어 실행, USB 데이터 연결, 부트로더 또는 USB 초기화 과정에 문제가 있을 수 있습니다. 이때는 케이블과 포트를 먼저 확인한 뒤 펌웨어 상태를 점검하는 것이 좋습니다.

    3. MCU는 키가 눌렸는지 어떻게 찾을까?

    대부분의 키보드는 모든 스위치를 MCU 핀에 하나씩 직접 연결하지 않습니다. 키가 많아질수록 필요한 배선과 GPIO 수가 지나치게 증가하기 때문입니다. 대신 스위치를 행과 열로 묶은 키보드 매트릭스 구조를 사용합니다.

    예를 들어 5개의 행과 15개의 열로 구성된 매트릭스라면 최대 75개 위치를 20개의 신호선으로 확인할 수 있습니다. MCU는 특정 행이나 열에 신호를 보낸 다음 반대쪽 선의 상태를 읽으며 어느 교차점이 연결되었는지 조사합니다.

    단계 MCU가 수행하는 작업
    1 하나의 행 또는 열을 활성화
    2 반대 방향의 입력 핀 상태를 읽음
    3 다음 행 또는 열로 이동
    4 전체 매트릭스의 현재 상태를 완성
    5 이전 상태와 비교해 눌림과 해제를 판별

    QMK 공식 문서에서는 매트릭스 스캔을 키보드 펌웨어의 핵심 기능으로 설명합니다. 실제로 MCU는 이 과정을 매우 짧은 간격으로 반복하면서 사용자가 키를 누르거나 떼는 순간을 찾아냅니다. :contentReference[oaicite:0]{index=0}

    매트릭스 스캔은 한 번만 실행되는 작업이 아닙니다. MCU는 전체 행과 열을 읽은 직후 다시 처음부터 스캔합니다. 이 반복 속도를 스캔 레이트라고 하며, 실제 입력 지연에는 스캔 주기뿐 아니라 디바운스 시간, 펌웨어 처리, USB 리포트 전송 주기도 함께 영향을 줍니다.

    🔍 Link&Tem Insight

    높은 클록 속도의 MCU를 사용한다고 키보드 지연 시간이 자동으로 크게 줄어드는 것은 아닙니다. 매트릭스 구조, 스캔 코드, 디바운스 알고리즘, USB 폴링 간격과 펌웨어 기능의 처리 방식이 함께 맞아야 안정적인 입력 성능을 얻을 수 있습니다.

    4. 스위치 신호가 바로 입력되지 않는 이유

    기계식 스위치의 금속 접점은 눌리는 순간 한 번만 깔끔하게 붙지 않을 수 있습니다. 접점이 매우 짧은 시간 동안 여러 번 붙었다 떨어지는 현상이 발생할 수 있으며, 이를 바운스라고 합니다.

    MCU가 모든 전기적 변화를 그대로 입력으로 처리하면 사용자는 키를 한 번 눌렀는데 같은 문자가 두 번 이상 입력될 수 있습니다. 이를 방지하기 위해 펌웨어는 일정한 기준에 따라 신호를 안정화하는 디바운스 처리를 수행합니다.

    디바운스는 단순히 일정 시간 동안 입력을 무시하는 방식으로만 동작하지 않습니다. 펌웨어에 따라 전체 매트릭스의 변화를 기준으로 판단하거나, 각 키의 상태를 개별적으로 추적하거나, 연속해서 동일한 상태가 확인되었을 때만 입력을 확정할 수 있습니다.

    MCU가 구분해야 하는 키 상태
    • 이전에도 눌려 있었고 지금도 눌려 있는 상태
    • 이전에는 없었지만 새롭게 눌린 상태
    • 이전에는 눌려 있었지만 지금은 해제된 상태
    • 접점 바운스로 인해 짧게 반복되는 불안정한 상태

    디바운스 시간을 지나치게 길게 설정하면 채터링은 줄어들 수 있지만 빠르게 같은 키를 연타할 때 반응이 둔해질 수 있습니다. 반대로 너무 짧게 설정하면 오래되었거나 접점 상태가 좋지 않은 스위치에서 중복 입력이 나타날 수 있습니다.

    💡 TIP

    특정 키에서만 중복 입력이 발생한다면 MCU 성능보다 해당 스위치의 접점 상태나 소켓 접촉 문제를 먼저 확인하는 것이 좋습니다. 여러 키에서 동시에 문제가 나타난다면 펌웨어의 디바운스 설정과 매트릭스 회로도 함께 점검해야 합니다.

    5. 위치 정보는 어떻게 Keycode로 바뀔까?

    MCU가 매트릭스에서 확인하는 것은 문자가 아니라 행과 열의 위치입니다. 예를 들어 특정 키를 눌렀을 때 MCU가 처음 얻는 정보는 “2번 행과 4번 열이 연결되었다”와 같은 좌표입니다.

    이 좌표를 실제 기능으로 바꾸는 기준이 키맵입니다. 펌웨어는 현재 활성화된 레이어의 키맵을 확인해 해당 위치에 지정된 Keycode를 찾습니다.

    같은 물리적 스위치라도 기본 레이어에서는 숫자 키로 작동하고, Fn 레이어에서는 기능키나 미디어 제어 키로 작동할 수 있습니다. MCU는 현재 레이어 상태, 눌린 수정키, 탭·홀드 조건 등을 함께 확인한 뒤 최종 동작을 결정합니다.

    처리 정보 의미
    행·열 좌표 실제로 눌린 스위치의 물리적 위치
    레이어 상태 현재 적용해야 할 키맵 선택
    Keycode 해당 위치에서 실행할 기능을 나타내는 내부 값
    키 이벤트 새로 눌렸는지 또는 해제되었는지 나타내는 변화

    QMK에서는 기본 키보드 입력뿐 아니라 레이어 전환, 매크로, 탭 댄스, 원샷 모디파이어와 같은 기능도 Keycode와 이벤트 처리 구조 안에서 실행됩니다. 사용자 정의 Keycode 역시 펌웨어가 정해진 범위의 값으로 구분하여 처리할 수 있습니다. :contentReference[oaicite:1]{index=1}

    🔍 Link&Tem Insight

    Keycode는 PC에 그대로 전송되는 문자 자체와 같지 않습니다. MCU 내부에서 기능을 구분하기 위한 값이며, 일부 Keycode는 키보드 안에서만 처리됩니다. 예를 들어 레이어 전환 Keycode는 PC로 전송되지 않고 MCU가 활성 레이어를 바꾸는 데 사용됩니다.

    6. MCU와 QMK Firmware는 어떤 관계일까?

    MCU가 키보드의 하드웨어라면 QMK Firmware는 그 하드웨어에서 실행되는 소프트웨어입니다. MCU만 PCB에 장착되어 있다고 해서 자동으로 키 입력을 처리하는 것은 아닙니다. 어떤 GPIO를 행과 열로 사용할지, 키맵을 어떻게 읽을지, USB 데이터를 어떤 형식으로 보낼지를 정의한 펌웨어가 필요합니다.

    QMK 공식 설명처럼 키보드 안의 프로세서는 버튼 입력을 감지하고 그 정보를 호스트 컴퓨터에 전달하는 소프트웨어를 실행합니다. 사용자가 QMK 키맵을 빌드한다는 것은 결국 특정 MCU가 실행할 프로그램을 만드는 과정입니다. :contentReference[oaicite:2]{index=2}

    하드웨어와 펌웨어의 역할 구분
    • MCU : 명령어를 실행하고 실제 전기 신호를 읽는 장치
    • QMK Firmware : 키 입력을 어떻게 처리할지 정의한 프로그램
    • 키맵 : 각 물리적 위치에 어떤 기능을 넣을지 정한 데이터
    • 부트로더 : 새로운 펌웨어를 MCU에 기록할 수 있게 해주는 프로그램

    QMK를 빌드하면 선택한 키보드와 MCU에 맞는 실행 파일이 만들어집니다. AVR 계열에서는 HEX 파일이 사용되는 경우가 많고, ARM 기반 MCU에서는 BIN이나 UF2 같은 형식이 사용될 수 있습니다. 생성된 파일을 부트로더를 통해 플래시에 기록하면 MCU가 다음 부팅부터 새로운 펌웨어를 실행합니다.

    잘못된 키맵을 작성하면 특정 키가 다른 기능으로 작동할 수 있고, 보드 설정이나 핀 정의가 잘못되면 매트릭스 자체를 읽지 못할 수도 있습니다. 따라서 펌웨어는 단순한 키 배치표가 아니라 MCU의 주변 장치와 키보드 회로를 제어하는 전체 프로그램에 가깝습니다.

    💡 TIP

    펌웨어를 직접 플래싱하기 전에는 키보드 모델과 리비전, MCU 종류, 부트로더 방식을 반드시 확인해야 합니다. 이름이 비슷한 다른 PCB용 파일을 기록하면 키 배열이나 USB 연결이 정상적으로 작동하지 않을 수 있습니다.
    Part 1 정리

    MCU는 키보드 매트릭스를 반복해서 스캔하고, 불안정한 스위치 신호를 정리한 뒤, 눌린 위치를 현재 레이어의 Keycode로 변환하는 핵심 제어 장치입니다. 이 모든 과정은 MCU에 저장된 QMK와 같은 펌웨어가 지시합니다. 다음 내용에서는 MCU가 처리한 Keycode를 USB 리포트로 전송하는 과정과 플래시·RAM·EEPROM의 차이, RGB와 무선 기능이 MCU 자원을 사용하는 방식, STM32와 RP2040을 선택할 때 확인해야 할 기준을 이어서 살펴봅니다.

    7. MCU가 USB HID Report를 만드는 과정

    키보드 매트릭스에서 눌린 스위치를 확인하고 해당 위치를 Keycode로 변환했다고 해서 입력 처리가 끝나는 것은 아닙니다. MCU는 이 정보를 컴퓨터가 이해할 수 있는 형식으로 다시 정리해야 합니다. USB 키보드에서는 일반적으로 이 데이터가 HID Report 형태로 전달됩니다.

    키 입력이 USB 데이터가 되는 흐름
    스위치 상태 확인 → 행과 열 좌표 판별 → Keycode 조회 → Modifier와 일반 키 구분 → HID Report 생성 → USB 엔드포인트를 통해 PC로 전송

    예를 들어 사용자가 Ctrl+C를 누르면 MCU는 Ctrl 키를 일반 문자 키와 똑같이 처리하지 않습니다. Ctrl, Shift, Alt, GUI와 같은 키는 Modifier 영역에 기록하고, C 키는 별도의 Keycode 영역에 기록합니다. 이렇게 만들어진 Report를 컴퓨터가 읽으면 운영체제는 두 키가 동시에 눌렸다고 해석합니다.

    Report 요소 담기는 정보 예시
    Modifier Ctrl, Shift, Alt, GUI 상태 왼쪽 Ctrl이 눌렸는지 표시
    일반 Keycode 문자, 숫자, 기능키 입력 A, Enter, F1 등
    상태 변화 키가 눌렸는지 해제됐는지 C 입력 후 빈 Report 전송

    키를 떼는 동작도 중요합니다. MCU가 키가 눌렸다는 Report만 보내고 해제됐다는 상태를 보내지 않으면 컴퓨터는 해당 키가 계속 눌린 것으로 판단할 수 있습니다. 따라서 MCU는 매 스캔 주기마다 현재 상태를 비교하고, 필요한 경우 새로운 Report를 만들어 전송합니다.

    핵심 포인트 Polling Rate는 컴퓨터가 키보드의 USB 데이터를 확인하는 빈도와 관련되고, Scan Rate는 MCU가 키 매트릭스를 검사하는 빈도와 관련됩니다. 두 값은 서로 연결되어 있지만 같은 개념은 아닙니다.

    8. Flash, RAM, EEPROM은 각각 무엇을 저장할까?

    MCU 내부에는 모든 데이터를 같은 방식으로 저장하는 하나의 공간만 있는 것이 아닙니다. 펌웨어 코드, 실행 중에 바뀌는 값, 전원이 꺼진 뒤에도 유지해야 하는 설정은 서로 다른 성격을 가지므로 각각 적합한 메모리 영역이 사용됩니다.

    메모리 주요 역할 전원 차단 후 유지 키보드에서의 예시
    Flash 펌웨어 프로그램과 고정 데이터 저장 유지됨 QMK 코드, 키맵, 기능 모듈
    RAM 실행 중 필요한 임시 상태 저장 유지되지 않음 현재 눌린 키, 매트릭스 상태, 타이머 값
    EEPROM 사용자가 변경한 설정 저장 유지됨 기본 레이어, RGB 설정, 일부 사용자 옵션

    Flash에는 MCU가 실행할 펌웨어가 기록됩니다. 키보드에 새로운 펌웨어를 플래싱한다는 것은 일반적으로 이 Flash 영역의 프로그램을 교체하는 작업입니다. 펌웨어 용량이 MCU의 Flash 크기를 넘으면 빌드가 실패하거나 일부 기능을 제외해야 합니다.

    RAM은 키보드가 작동하는 동안 계속 바뀌는 데이터를 처리합니다. 현재 활성화된 레이어, 눌린 키 목록, 디바운스 상태, RGB 애니메이션 계산값, USB 전송 버퍼 등이 RAM을 사용할 수 있습니다. 전원이 꺼지면 이 내용은 사라지며, 다음 부팅 때 다시 초기화됩니다.

    EEPROM은 사용자가 변경한 설정을 전원 차단 후에도 유지할 때 사용됩니다. 다만 모든 MCU가 별도의 물리 EEPROM을 내장하는 것은 아닙니다. 일부 MCU나 펌웨어 환경에서는 Flash의 일부 영역을 EEPROM처럼 사용하는 에뮬레이션 방식이 사용될 수 있습니다.

    TIP. 펌웨어 용량이 부족할 때 사용하지 않는 RGB 효과, 오디오 기능, 콘솔 출력, 마우스 키, OLED 기능 등을 비활성화하면 Flash와 RAM 사용량을 줄일 수 있습니다. MCU 성능이 충분해도 저장 공간이 작으면 원하는 기능을 모두 넣기 어려울 수 있습니다.

    9. RGB, OLED, Encoder도 MCU가 처리한다

    MCU의 역할은 키 입력 처리에만 한정되지 않습니다. 최근 커스텀 키보드에는 RGB LED, OLED 화면, 로터리 Encoder, 터치 센서, 무선 통신 모듈처럼 다양한 부품이 추가됩니다. 이 장치들은 대부분 MCU와 직접 또는 간접적으로 통신하며, 펌웨어는 정해진 주기마다 각 장치의 상태를 읽거나 데이터를 출력합니다.

    RGB LED
    색상과 밝기를 계산하고 LED 배열에 데이터를 전송합니다. 복잡한 애니메이션은 연산량과 메모리 사용량을 늘릴 수 있습니다.
    “`
    OLED
    레이어, Caps Lock, 로고, 애니메이션 등을 화면 버퍼에 구성한 뒤 I²C 또는 SPI 방식으로 디스플레이에 전달합니다.
    Rotary Encoder
    두 신호의 변화 순서를 읽어 회전 방향을 판별합니다. 이후 볼륨 조절이나 스크롤 같은 Keycode를 실행합니다.
    무선 통신
    Bluetooth 또는 2.4GHz 모듈과 통신하고 연결 상태, 절전, 배터리 관리, 입력 전송을 처리합니다.
    “`

    기능이 많아질수록 MCU가 해야 할 일도 증가합니다. 그러나 단순히 클럭 속도가 높은 MCU를 사용한다고 모든 문제가 해결되는 것은 아닙니다. 펌웨어의 작업 순서, 인터럽트 처리, 통신 방식, 메모리 관리가 비효율적이면 키 스캔이 지연되거나 RGB 애니메이션이 끊길 수 있습니다.

    성능보다 중요한 것은 작업 배분이다
    키 입력 스캔은 짧고 일정한 주기로 반복되어야 합니다. OLED 화면을 한 번 갱신하는 데 너무 긴 시간이 걸리거나, RGB 효과 계산이 메인 루프를 오래 점유하면 입력 응답에 영향을 줄 수 있습니다. 좋은 펌웨어는 부가 기능이 핵심 입력 처리를 방해하지 않도록 구성됩니다.

    10. STM32와 RP2040이 키보드에 많이 사용되는 이유

    커스텀 키보드에서 자주 볼 수 있는 MCU 계열로는 STM32와 RP2040이 있습니다. 두 계열 모두 다양한 기능을 구현할 수 있지만, 내부 구조와 개발 환경, USB 구성, 메모리 용량, 보드 설계 방식에는 차이가 있습니다.

    비교 항목 STM32 RP2040
    제품 구성 성능과 주변장치가 다른 다양한 모델 존재 대표 칩 중심으로 비교적 통일된 구성
    CPU 구조 모델에 따라 Cortex-M0, M3, M4 등 다양 듀얼 코어 Cortex-M0+
    프로그램 저장 대체로 내부 Flash 사용 외부 QSPI Flash 사용
    키보드 장점 선택지가 많고 제품별 최적화 가능 넉넉한 자원과 편리한 부트로더 환경
    주의점 정확한 모델에 따라 사양 차이가 큼 외부 Flash와 전원 회로를 함께 설계해야 함

    STM32는 하나의 MCU가 아니라 매우 넓은 제품군입니다. 따라서 STM32라는 이름만 보고 성능을 단정하기 어렵습니다. 정확한 모델명과 Flash, RAM, GPIO 수, USB 지원 여부를 함께 확인해야 합니다.

    RP2040은 비교적 넉넉한 SRAM과 듀얼 코어, 유연한 PIO 기능을 갖추고 있으며, 부트셀 버튼을 활용한 파일 복사 방식의 펌웨어 기록이 편리한 편입니다. QMK 기반 키보드에서도 RP2040을 사용하는 컨트롤러와 PCB가 점차 보편적으로 활용되고 있습니다.

    어느 쪽이 무조건 더 좋을까? MCU 이름만으로 키보드의 입력 지연이나 완성도를 판단하기는 어렵습니다. PCB 회로, USB 설정, 스캔 방식, 디바운스 알고리즘, 펌웨어 최적화가 함께 작동하기 때문입니다. 필요한 기능을 안정적으로 처리할 수 있는지가 더 중요합니다.

    11. 좋은 키보드 MCU를 판단하는 기준

    키보드에 적합한 MCU는 단순히 클럭 속도가 가장 높은 제품이 아닙니다. 키 매트릭스 크기와 필요한 부가 기능을 충분히 지원하면서도 펌웨어 생태계와 부품 수급, 전력 소비, PCB 설계 난이도가 균형을 이루어야 합니다.

    확인해야 할 항목
    “`
    ① GPIO 수 키 매트릭스의 행과 열, RGB, Encoder, OLED, 상태 LED 등을 연결할 핀이 충분해야 합니다.
    ② Flash와 RAM 용량 VIA, VIAL, RGB Matrix, OLED, 매크로처럼 기능이 많아질수록 더 많은 저장 공간과 실행 메모리가 필요합니다.
    ③ USB 지원 하드웨어 USB 기능과 펌웨어 지원이 안정적이어야 HID 장치로 원활하게 동작할 수 있습니다.
    ④ 펌웨어 호환성 QMK에서 해당 MCU와 보드를 얼마나 안정적으로 지원하는지, 참고할 수 있는 기존 설계가 충분한지도 중요합니다.
    ⑤ 전력 소비 유선 키보드보다 배터리를 사용하는 무선 키보드에서 특히 중요합니다. 절전 모드와 웨이크업 기능도 확인해야 합니다.
    “`
    결국 MCU는 키보드 전체의 조정자다
    MCU는 스위치 신호를 읽고, 디바운스를 적용하고, 레이어와 Keycode를 해석하고, USB Report를 만든 뒤 컴퓨터로 전달합니다. 동시에 RGB, OLED, Encoder, 저장 설정까지 관리합니다. 우리가 키 하나를 누르는 짧은 순간에도 MCU 내부에서는 여러 단계가 빠르게 반복됩니다.

    자주 묻는 질문

    MCU가 빠르면 키보드 입력도 무조건 빨라질까?
    그렇지는 않습니다. MCU 성능은 중요한 요소지만 매트릭스 스캔 주기, 디바운스 방식, USB Polling 설정, 펌웨어 구조도 함께 영향을 줍니다. 충분한 성능의 MCU에서는 펌웨어 최적화 차이가 더 크게 나타날 수 있습니다.
    “`
    MCU가 고장 나면 스위치만 교체해도 해결될까?
    MCU 자체나 주변 전원·USB 회로가 손상됐다면 스위치 교체만으로 해결되지 않습니다. 전체 키가 작동하지 않거나 USB 인식이 되지 않는다면 MCU, USB 커넥터, 전원 회로, 펌웨어 상태를 함께 확인해야 합니다.
    VIA에서 바꾼 키맵도 MCU에 저장될까?
    VIA를 지원하는 펌웨어에서는 변경된 키맵이나 설정이 MCU의 비휘발성 저장 영역에 기록될 수 있습니다. 구체적인 저장 방식과 범위는 보드의 MCU, QMK 설정, EEPROM 구현에 따라 달라질 수 있습니다.
    무선 키보드에도 MCU가 들어갈까?
    들어갑니다. 무선 키보드의 MCU 또는 무선 SoC는 키 스캔뿐 아니라 Bluetooth 연결, 배터리 상태, 절전 모드, 무선 패킷 전송까지 처리합니다. 제품에 따라 키보드 제어용 MCU와 무선 통신 칩이 분리되기도 합니다.
    키보드마다 펌웨어 파일이 다른 이유는 무엇일까?
    MCU 종류, 핀 연결, 매트릭스 배열, LED 구성, 부트로더, USB 설정이 보드마다 다르기 때문입니다. 외형이 비슷한 키보드라도 다른 보드용 펌웨어를 기록하면 정상 작동하지 않을 수 있습니다.
    “`

    함께 보면 좋은 글

    공식 자료

    Sources

    • QMK Firmware Documentation, Understanding QMK
    • QMK Firmware Documentation, How a Keyboard Matrix Works
    • QMK Firmware Documentation, Quantum Keycodes
    • Raspberry Pi Documentation, RP2040 Microcontroller
    • STMicroelectronics, STM32 32-bit Arm Cortex MCU Documentation
    • USB Implementers Forum, Human Interface Device Class Specifications
    LINK&TEM SUMMARY
    MCU는 키보드의 스위치 신호를 읽고 Keycode와 USB 데이터로 변환하며, 메모리와 RGB·OLED·Encoder 같은 부가 기능까지 통합 관리하는 핵심 제어 장치입니다.
  • QMK Firmware 구조 완벽 이해: 키 입력부터 레이어·EEPROM·MCU까지

    QMK Firmware 구조 완벽 이해: 키 입력부터 레이어·EEPROM·MCU까지

    LINK&TEM GUIDE

    QMK Firmware 구조

    키 입력 처리부터 keymap.c·info.json·config.h가 합쳐지는 과정까지

    📌 핵심 요약
    • QMK Firmware는 키보드 MCU에서 실행되며 스위치 상태를 읽고 USB 또는 무선 입력 보고서를 만드는 펌웨어입니다.
    • QMK 소스는 공통 코어, MCU·보드 지원 코드, 키보드별 하드웨어 정의, 사용자 키맵이 계층적으로 결합되는 구조입니다.
    • info.json은 배열과 하드웨어 정보를, config.h는 컴파일 설정을, rules.mk는 사용할 기능과 소스 구성을 정의합니다.
    • keymap.c에는 각 레이어의 키 배치와 사용자 지정 입력 동작이 저장됩니다.
    • 컴파일된 펌웨어에는 필요한 기능만 포함되며, 완성된 바이너리를 MCU에 플래시해야 실제 키보드 동작이 바뀝니다.

    커스텀 키보드 설명에서 자주 등장하는 QMK Firmware는 단순히 키 위치를 바꾸는 프로그램이 아닙니다. 키보드 전원이 켜진 순간부터 스위치 상태를 확인하고, 눌린 키를 해석하며, 레이어와 매크로를 처리하고, 최종 입력을 컴퓨터에 전달하는 전체 동작을 담당합니다.

    VIA에서 키 하나를 바꾸면 화면에서는 단순한 키맵 변경처럼 보이지만, 그 아래에서는 QMK가 정의한 키코드 구조와 레이어 처리 방식, 메모리 저장 방식, USB HID 보고서 생성 과정이 함께 작동합니다. 직접 QMK 소스를 수정할 때는 여기에 키보드 매트릭스 핀, 다이오드 방향, MCU 종류, 부트로더, RGB 기능과 같은 하드웨어 설정까지 다뤄야 합니다.

    QMK Firmware 구조가 어렵게 느껴지는 가장 큰 이유는 파일이 많기 때문입니다. 하지만 모든 파일을 한꺼번에 이해할 필요는 없습니다. QMK를 크게 보면 공통 펌웨어 엔진, 키보드 하드웨어 정의, 사용자 키맵이라는 세 계층으로 나눌 수 있습니다. 이 계층이 컴파일 단계에서 하나로 합쳐져 MCU가 실행할 펌웨어가 됩니다.


    1. QMK Firmware는 키보드 안에서 무엇을 할까?

    키보드 스위치는 문자 정보를 직접 만들어내지 않습니다. 사용자가 A 키를 누르더라도 스위치가 MCU에 전달하는 것은 특정 행과 열이 전기적으로 연결되었다는 상태 변화에 가깝습니다. 어느 위치가 어떤 문자에 해당하는지는 펌웨어가 판단합니다.

    QMK는 먼저 키보드 매트릭스를 반복적으로 스캔합니다. 이전 스캔 결과와 현재 결과를 비교해 새로 눌린 키와 해제된 키를 찾고, 접점의 순간적인 흔들림을 걸러내기 위해 디바운스 처리를 적용합니다. 그다음 현재 레이어와 키맵을 기준으로 해당 위치의 키코드를 결정합니다.

    키코드가 단순한 영문자라면 비교적 바로 처리할 수 있지만, QMK에서는 하나의 키에 훨씬 복잡한 동작을 지정할 수 있습니다. 짧게 누르면 Escape, 길게 누르면 Control로 작동하게 만들거나, 키를 누르는 동안만 다른 레이어를 활성화하거나, 여러 키를 순서대로 실행하는 매크로를 연결할 수도 있습니다.

    모든 처리가 끝나면 QMK는 현재 눌린 키 정보를 USB HID 형식의 보고서로 구성합니다. 컴퓨터는 이 보고서를 받아 운영체제의 키보드 입력으로 처리합니다. 따라서 QMK는 물리적인 스위치 변화와 운영체제가 이해하는 키 입력 사이를 연결하는 핵심 소프트웨어라고 볼 수 있습니다.

    QMK의 기본 입력 처리 흐름
    1. MCU가 키보드 매트릭스의 행과 열을 스캔합니다.
    2. 이전 상태와 비교해 눌림 또는 해제 이벤트를 찾습니다.
    3. 디바운스 로직으로 접점의 불안정한 신호를 정리합니다.
    4. 활성 레이어와 키맵을 기준으로 키코드를 결정합니다.
    5. 탭·홀드, 레이어, 콤보, 매크로 같은 기능을 처리합니다.
    6. USB HID 보고서를 생성해 컴퓨터로 전송합니다.

    이 과정은 키를 한 번 누를 때만 실행되는 것이 아닙니다. MCU의 메인 루프가 계속 반복되면서 매트릭스를 스캔하고 각종 작업을 처리합니다. 조명 애니메이션, 인코더 회전, OLED 표시, 분할 키보드 통신 같은 기능도 이 반복 구조 안에서 함께 관리됩니다.

    💡 Link&Tem Insight

    QMK에서 키 입력 속도를 이해할 때는 매트릭스 스캔과 USB Polling을 구분해야 합니다. 매트릭스 스캔은 MCU가 스위치 상태를 확인하는 내부 과정이고, USB Polling은 컴퓨터가 USB 장치의 보고서를 확인하는 통신 주기입니다. 내부 스캔이 빨라도 디바운스 설정과 USB 전송 주기에 따라 최종 입력 지연은 달라질 수 있습니다.

    2. QMK 소스는 어떤 계층으로 나뉠까?

    QMK Firmware 저장소를 열어보면 수많은 폴더와 C 파일이 표시됩니다. 처음에는 키보드 하나를 작동시키는 데 왜 이렇게 많은 코드가 필요한지 의문이 들 수 있습니다. 이는 QMK가 특정 키보드 한 대만을 위한 펌웨어가 아니라 다양한 MCU와 수많은 키보드 설계를 공통 구조로 지원하기 때문입니다.

    QMK 공식 저장소의 공통 영역에는 키 입력 처리, 레이어, 키코드, USB 통신, 조명, 오디오, 포인팅 장치 등 여러 키보드에서 재사용하는 기능이 들어 있습니다. 사용자는 이 공통 코드를 매번 새로 작성하지 않고, 자신의 키보드에 필요한 하드웨어 정보와 키맵만 추가해 펌웨어를 만들 수 있습니다.

    구조 주요 역할
    QMK 공통 코어 키코드, 레이어, USB HID, 매크로, 디바운스 등 공통 기능 처리
    플랫폼·드라이버 AVR·ARM·RP2040 계열 MCU와 GPIO, 타이머, 통신 장치 제어
    키보드 폴더 매트릭스 핀, 배열, 부트로더, PCB별 기능과 하드웨어 정의
    리비전 폴더 같은 제품에서 PCB 버전이나 MCU가 달라질 때 차이 분리
    키맵 폴더 사용자별 레이어, 키 배치, 기능 설정과 사용자 코드 저장

    예를 들어 하나의 키보드 제품에 여러 PCB 리비전이 존재한다면 상위 키보드 폴더에는 공통 설정을 두고, 하위 리비전 폴더에는 MCU나 핀 배치처럼 달라진 부분만 저장할 수 있습니다. QMK는 상위 폴더와 하위 폴더의 설정을 계층적으로 읽어 최종 구성을 만듭니다.

    이 구조 덕분에 같은 키보드의 여러 버전이 공통 코드를 공유할 수 있습니다. 반대로 폴더 계층을 제대로 이해하지 못하고 하위 리비전의 설정만 수정하면 상위 폴더에서 내려온 값과 충돌하거나, 의도한 키보드가 아닌 다른 빌드 대상에 설정을 적용하는 실수가 생길 수 있습니다.

    TIP|수정하기 전에 정확한 빌드 대상을 확인하세요

    키보드 이름이 같더라도 rev1, rev2, ansi, iso, solder, hotswap처럼 PCB 또는 배열별 하위 폴더가 나뉠 수 있습니다. 펌웨어를 수정하기 전에는 현재 PCB에 해당하는 정확한 키보드 경로와 MCU 종류를 먼저 확인하는 것이 안전합니다.

    3. 키보드 폴더 안의 주요 파일

    QMK 키보드 폴더를 이해하려면 모든 C 파일보다 먼저 info.json, config.h, rules.mk, keymap.c의 역할을 구분해야 합니다. 이 네 파일은 비슷해 보이지만 담당하는 정보가 다릅니다.

    최근 QMK는 키보드의 정적인 정보를 가능한 한 info.json으로 관리하는 데이터 기반 구성을 사용합니다. QMK 공식 문서에 따르면 info.json의 정보는 config.h와 rules.mk의 설정과 결합되어 컴파일 시 필요한 최종 구성을 만듭니다. 또한 QMK API와 Configurator가 키보드 배열을 표시할 때도 이 정보가 사용됩니다. :contentReference[oaicite:0]{index=0}

    info.json|키보드의 구조화된 설명서

    info.json에는 키보드 이름, 제조사, USB 식별 정보, MCU와 부트로더, 매트릭스 크기, 다이오드 방향, 지원 기능, 물리적 레이아웃 같은 내용을 JSON 형식으로 작성할 수 있습니다. 특히 키보드의 키 위치와 배열 정보는 QMK Configurator가 화면에 키보드를 그릴 때 중요한 기준이 됩니다.

    여기서 주의할 점은 물리적인 키 위치와 전기적인 매트릭스 위치가 같지 않을 수 있다는 것입니다. 키보드 위에서 왼쪽부터 순서대로 배치된 키라도 PCB 배선에서는 서로 다른 행과 열에 연결될 수 있습니다. info.json의 레이아웃 정의는 화면상의 위치와 매트릭스 좌표를 연결하는 역할을 합니다.

    config.h|컴파일 전 적용되는 설정값

    config.h는 C 전처리기 매크로를 이용해 펌웨어 동작을 설정하는 헤더 파일입니다. 기능별 시간값, 버퍼 크기, 입력 방식, 조명 관련 옵션처럼 컴파일 과정에서 코드가 참고해야 할 값을 정의할 수 있습니다.

    QMK는 폴더 계층마다 config.h를 둘 수 있으며, 상위 키보드 설정과 하위 리비전 설정, 키맵별 설정이 최종 빌드에 반영됩니다. 특정 값을 하위 단계에서 다시 지정해야 할 때는 이미 정의된 매크로를 #undef로 해제한 뒤 새 값으로 정의해야 하는 경우도 있습니다. :contentReference[oaicite:1]{index=1}

    rules.mk|포함할 기능과 빌드 규칙

    rules.mk는 어떤 QMK 기능을 펌웨어에 포함할지 결정하는 빌드 설정 파일입니다. 예를 들어 RGB Matrix, OLED, 인코더, 오디오, 마우스 키, 콤보 기능을 활성화하면 관련 소스가 빌드 대상에 들어갑니다.

    모든 기능을 무조건 활성화하지 않는 이유는 MCU의 플래시 메모리와 RAM이 제한되어 있기 때문입니다. 사용하지 않는 기능을 제외하면 펌웨어 크기를 줄일 수 있고, 작은 용량의 AVR MCU에서도 필요한 기능을 선택적으로 사용할 수 있습니다.

    다만 최근 QMK 구조에서는 여러 정적 설정이 info.json으로 이동했으며, 내용이 없는 rules.mk는 필수가 아닙니다. 따라서 오래된 QMK 강좌와 최신 키보드 폴더를 비교하면 파일 구성이 다르게 보일 수 있습니다. :contentReference[oaicite:2]{index=2}

    keymap.c|레이어와 사용자 입력 동작

    keymap.c는 사용자가 가장 자주 수정하는 파일입니다. 기본 레이어와 Fn 레이어에 어떤 키코드를 배치할지 정의하며, 키를 눌렀을 때 실행할 사용자 지정 코드도 작성할 수 있습니다.

    단순한 키맵은 키코드 배열만으로 완성되지만, 복잡한 키맵에서는 process_record_user(), matrix_scan_user(), layer_state_set_user() 같은 사용자 후크를 활용할 수 있습니다. 이를 통해 특정 키 입력을 가로채거나, 레이어 상태에 따라 LED를 바꾸거나, 주기적으로 실행할 동작을 추가할 수 있습니다.

    파일 주요 정보 주로 수정하는 상황
    info.json 배열, MCU, 매트릭스, 기능 등 구조화된 정보 새 키보드·PCB 정의
    config.h 전처리 매크로와 세부 동작값 시간값·기능 옵션 조정
    rules.mk 활성 기능과 빌드 대상 QMK 기능 추가·제거
    keymap.c 레이어별 키코드와 사용자 코드 키 배치·매크로·동작 변경
    💡 Link&Tem Insight

    info.json과 keymap.c는 모두 키 배열과 관련 있지만 목적이 다릅니다. info.json은 키보드가 어떤 물리 배열과 매트릭스 구조를 지원하는지 설명하고, keymap.c는 그 배열의 각 위치에 어떤 키코드를 넣을지 결정합니다. 즉 info.json이 키보드의 설계도라면 keymap.c는 사용자가 선택한 실제 배치에 가깝습니다.

    4. LAYOUT 매크로는 왜 필요할까?

    keymap.c를 보면 키코드가 단순한 2차원 매트릭스 배열이 아니라 LAYOUT, LAYOUT_ansi, LAYOUT_60_ansi 같은 이름 안에 작성된 경우가 많습니다. 이 LAYOUT 매크로는 사용자가 보는 물리적 키 배열을 PCB의 행과 열 좌표로 변환합니다.

    PCB 매트릭스는 배선 효율을 기준으로 구성되기 때문에 실제 키보드 모양과 다를 수 있습니다. 사용자가 keymap.c에 매트릭스 좌표를 직접 입력해야 한다면 키 하나를 변경할 때마다 회로도를 확인해야 합니다. LAYOUT 매크로를 사용하면 키보드 위에 보이는 순서대로 키코드를 작성하고, 내부에서 올바른 매트릭스 좌표로 재배열할 수 있습니다.

    LAYOUT 매크로가 연결하는 두 구조
    • 물리 배열: 사용자가 실제 키보드에서 보는 키 위치
    • 전기 매트릭스: PCB에서 각 스위치가 연결된 행과 열 위치
    • 키코드 배열: 각 물리 위치에 사용자가 지정한 입력 기능

    하나의 PCB가 ANSI Enter와 ISO Enter, 분할 Backspace, 분할 Spacebar 같은 여러 배열을 지원한다면 LAYOUT 매크로도 여러 개 존재할 수 있습니다. 이때 자신의 실제 조립 배열과 다른 매크로를 선택하면 키 개수가 맞지 않거나 일부 위치가 의도와 다르게 연결될 수 있습니다.

    QMK Configurator에서 배열을 고를 때 여러 레이아웃 이름이 나타나는 것도 같은 이유입니다. Configurator가 단순히 키보드 제품명만 확인하는 것이 아니라, 해당 PCB가 제공하는 LAYOUT 정의를 읽어 선택 가능한 배열을 보여주는 것입니다.

    TIP|키맵을 복사할 때 LAYOUT 이름도 확인하세요

    다른 사용자의 keymap.c를 복사했는데 컴파일 오류가 발생한다면 키코드보다 LAYOUT 매크로 이름과 키 개수를 먼저 확인하는 것이 좋습니다. 같은 60% 키보드라도 PCB가 지원하는 배열과 매크로 이름은 다를 수 있습니다.

    5. keymap.c에서 레이어는 어떻게 표현될까?

    QMK의 레이어는 서로 다른 키맵 배열을 여러 장 겹쳐 놓은 구조입니다. 일반적으로 Layer 0에는 기본 입력을 두고, Layer 1에는 숫자열이나 방향키, 미디어 키, RGB 제어 같은 보조 기능을 배치합니다.

    keymap.c에서는 각 레이어가 별도의 LAYOUT 배열로 정의됩니다. 레이어 번호는 단순히 화면 전환 순서가 아니라, 현재 활성화된 여러 레이어 가운데 어떤 키코드를 우선해서 읽을지 결정하는 기준이 됩니다.

    상위 레이어의 특정 위치가 KC_TRNS로 설정되어 있으면 QMK는 바로 아래 활성 레이어의 같은 위치를 확인합니다. 반대로 KC_NO는 해당 위치에서 아무 입력도 발생시키지 않습니다. 두 키코드는 화면에서 비슷하게 보일 수 있지만 레이어가 겹쳐질 때 결과가 완전히 다릅니다.

    키코드 동작 사용 예시
    KC_TRNS 아래 활성 레이어의 키코드를 통과시켜 사용 Fn 레이어에서 기본 키를 그대로 유지
    KC_NO 해당 위치의 입력을 차단 사용하지 않을 스위치 위치 비활성화
    MO(n) 누르는 동안 지정 레이어 활성화 일반적인 Fn 키
    TG(n) 누를 때마다 지정 레이어 켜기·끄기 고정 숫자·게임 레이어
    LT(n, kc) 짧게 누르면 키코드, 길게 누르면 레이어 Space와 Fn 기능 결합

    레이어 상태는 MCU가 실행 중인 동안 RAM에서 관리됩니다. 다만 기본 레이어처럼 전원을 껐다 켜도 유지해야 하는 설정은 EEPROM 또는 MCU의 비휘발성 저장 영역에 기록할 수 있습니다. 따라서 모든 레이어가 EEPROM에 통째로 저장되는 것은 아니며, 컴파일된 키맵과 실행 중인 레이어 상태, 비휘발성 기본 레이어 설정을 구분해야 합니다.

    6. QMK는 설정 파일을 어떻게 하나의 펌웨어로 만들까?

    QMK 소스 폴더에 있는 파일은 MCU가 그대로 실행할 수 있는 형태가 아닙니다. C 소스와 JSON 설정, 빌드 규칙을 컴파일해 MCU 종류에 맞는 기계어 바이너리로 변환해야 합니다.

    사용자가 키보드와 키맵을 지정해 컴파일을 시작하면 QMK 빌드 시스템은 해당 키보드 경로를 확인합니다. 이후 상위 키보드 폴더, 하위 리비전 폴더, 선택한 키맵 폴더에서 설정을 수집하고, info.json과 config.h, rules.mk의 내용을 결합합니다.

    그다음 선택한 MCU 플랫폼에 필요한 드라이버와 QMK 공통 코어, 활성화된 기능의 소스 코드, 키보드별 코드, keymap.c의 사용자 코드를 함께 컴파일합니다. 사용하지 않는 기능은 빌드 대상에서 제외되거나 최종 링크 과정에서 제거될 수 있습니다.

    QMK 펌웨어 빌드 흐름
    1. 컴파일할 키보드 경로와 키맵을 선택합니다.
    2. 키보드·리비전·키맵 폴더의 설정을 계층적으로 수집합니다.
    3. info.json, config.h, rules.mk를 바탕으로 최종 구성을 생성합니다.
    4. QMK 코어와 MCU 드라이버, 선택 기능, 사용자 코드를 컴파일합니다.
    5. 각 오브젝트 파일을 하나의 실행 가능한 펌웨어로 연결합니다.
    6. 부트로더와 MCU에 맞는 HEX, BIN 또는 UF2 파일을 생성합니다.

    출력 파일 형식은 MCU와 부트로더에 따라 다릅니다. AVR 기반 키보드에서는 HEX 파일을 자주 사용하고, ARM 계열에서는 BIN 파일이 사용될 수 있습니다. RP2040처럼 UF2 부트로더 방식을 사용하는 MCU에서는 UF2 파일을 저장 장치에 복사하는 방식으로 플래시할 수 있습니다.

    중요한 점은 QMK 소스 수정과 실제 키보드 변경이 서로 다른 단계라는 것입니다. keymap.c를 수정했더라도 다시 컴파일하지 않으면 새 펌웨어 파일이 만들어지지 않습니다. 컴파일된 파일을 만들었더라도 MCU에 플래시하지 않으면 현재 키보드는 기존 펌웨어를 계속 실행합니다.

    자주 발생하는 구조 이해 오류
    • 다른 PCB 리비전의 키맵을 컴파일하고 현재 키보드에 적용하려는 경우
    • MCU 또는 부트로더 설정이 실제 하드웨어와 다른 경우
    • rules.mk에서 기능만 활성화하고 필요한 핀이나 드라이버 설정을 누락한 경우
    • info.json의 물리 배열 좌표와 매트릭스 좌표를 같은 개념으로 이해한 경우
    • keymap.c 수정 후 기존에 생성된 펌웨어 파일을 다시 플래시한 경우
    • 펌웨어 크기가 MCU의 플래시 용량을 초과했는데 기능을 계속 추가한 경우
    💡 Link&Tem Insight

    QMK Configurator도 결과적으로 QMK 빌드 시스템을 이용합니다. 사용자가 웹 화면에서 배열을 구성하면 Configurator가 키맵 데이터를 만들고 서버에서 펌웨어를 컴파일합니다. 직접 소스를 수정하는 방식과 출발점은 다르지만, 최종적으로는 키보드 하드웨어 정의와 QMK 코어, 선택한 키맵이 결합된 펌웨어가 생성된다는 점은 같습니다.
    Part 1 정리

    QMK Firmware는 공통 코어와 MCU 드라이버, 키보드별 하드웨어 정의, 사용자 키맵을 계층적으로 결합하는 구조입니다. info.json은 키보드 구조를 설명하고, config.h는 세부 설정값을 정의하며, rules.mk는 포함할 기능을 선택하고, keymap.c는 실제 레이어와 키 동작을 구성합니다. 다음 부분에서는 MCU가 펌웨어를 실행하는 방식, 부팅부터 매트릭스 스캔까지의 내부 흐름, EEPROM과 플래시 메모리의 차이, VIA와 QMK 소스 방식의 구조 차이를 이어서 살펴보겠습니다.

    7

    전원이 켜진 뒤 QMK Firmware는 어떻게 동작할까?

    컴파일된 QMK Firmware가 키보드의 마이크로컨트롤러에 기록되면, 소스 코드의 파일 구조는 하나의 실행 가능한 펌웨어 이미지로 바뀝니다. 사용자가 키보드에 전원을 연결했을 때 마이크로컨트롤러는 플래시 메모리에 저장된 프로그램을 읽고 초기화 과정을 시작합니다.

    STEP 1
    전원 인가
    USB 또는 배터리에서 전원을 공급받습니다.
    “`
    STEP 2
    MCU 초기화
    클록, GPIO, 타이머와 통신 장치를 준비합니다.
    STEP 3
    QMK 초기화
    키맵, 레이어, 기능과 저장값을 불러옵니다.
    STEP 4
    반복 실행
    매트릭스를 스캔하고 키 입력을 처리합니다.
    “`

    초기화가 끝나면 QMK는 한 번 실행되고 종료되는 일반 프로그램처럼 동작하지 않습니다. 키보드가 켜져 있는 동안 매우 짧은 작업을 계속 반복하는 구조로 움직입니다. 이 반복 구간에서 스위치 상태 확인, 디바운스 처리, 키코드 변환, 레이어 판정, 매크로 실행, RGB 갱신, USB 보고서 전송 등이 순서대로 처리됩니다.

    핵심 포인트

    QMK의 중심은 특정 파일 하나가 아니라, 하드웨어 초기화와 키 입력 처리를 계속 연결하는 실행 흐름입니다. 키맵에 작성한 기능은 이 반복 흐름 안에서 조건에 맞을 때 호출됩니다.

    8

    매트릭스 스캔과 키코드 처리는 어떻게 연결될까?

    기계식 키보드의 스위치는 대부분 행과 열로 구성된 매트릭스 회로에 연결됩니다. QMK는 각 행과 열의 전기적 상태를 빠르게 확인해 어떤 스위치가 눌렸는지 판정합니다. 이때 확인된 위치는 곧바로 문자로 전송되는 것이 아니라 여러 처리 단계를 통과합니다.

    처리 단계 QMK가 하는 일 예시
    매트릭스 읽기 행과 열의 상태를 확인합니다. 2행 3열 스위치 눌림
    디바운스 접점 진동으로 발생한 불안정한 신호를 정리합니다. 한 번 누른 키가 여러 번 인식되는 현상 방지
    레이어 판정 현재 활성화된 레이어에서 해당 위치의 키코드를 찾습니다. 기본 레이어에서는 A, 기능 레이어에서는 F1
    이벤트 처리 일반 키, 모드탭, 매크로, 탭댄스 등의 동작을 실행합니다. 짧게 누르면 Esc, 길게 누르면 Ctrl
    HID 보고서 전송 처리 결과를 USB 또는 무선 HID 보고서로 호스트에 전달합니다. 운영체제가 키 입력을 수신

    따라서 키보드에서 물리적인 스위치 하나를 눌렀다고 해서 PC에 특정 문자가 고정적으로 전달되는 것은 아닙니다. 동일한 스위치 위치라도 현재 레이어, 조합 상태, 사용자 코드와 기능 설정에 따라 전혀 다른 결과가 만들어질 수 있습니다. 이것이 QMK 기반 키보드가 일반적인 고정형 펌웨어보다 유연한 이유입니다.

    9

    Flash와 EEPROM은 어떤 역할을 나눠 가질까?

    QMK Firmware를 이해할 때 자주 혼동되는 부분이 플래시 메모리와 EEPROM입니다. 두 저장 영역 모두 전원을 꺼도 정보가 유지될 수 있지만, 저장되는 데이터의 성격과 갱신 방식이 다릅니다.

    FLASH MEMORY

    펌웨어 프로그램 저장

    컴파일된 QMK 코드, 키맵, 활성화된 기능과 하드웨어 제어 로직이 포함됩니다. 소스 코드를 수정한 뒤 펌웨어를 다시 플래싱하면 이 영역의 프로그램이 교체됩니다.

    “`
    EEPROM

    사용자 설정값 저장

    기본 레이어, RGB 설정, 오디오 설정, VIA에서 변경한 키맵처럼 실행 중 바뀔 수 있는 값을 저장하는 데 사용됩니다. MCU에 따라 별도 EEPROM 대신 플래시 일부를 가상 EEPROM처럼 사용할 수도 있습니다.

    “`
    구분 Flash EEPROM 또는 가상 EEPROM
    주요 내용 실행할 펌웨어 코드 변경 가능한 설정값
    갱신 시점 펌웨어 플래싱 시 설정 변경 또는 저장 명령 실행 시
    대표 예시 keymap.c, 기능 코드, USB 처리 코드 VIA 키맵, 기본 레이어, RGB 밝기
    초기화 영향 다른 펌웨어를 플래싱하면 프로그램 변경 EEPROM 초기화 명령으로 설정값 삭제 가능
    주의할 점

    새 펌웨어를 플래싱했는데도 VIA 키맵이나 RGB 설정이 이전 상태로 남아 있다면, 플래시의 펌웨어와 EEPROM의 설정값이 별도로 유지되고 있기 때문일 수 있습니다. 구조가 크게 바뀐 펌웨어를 설치한 뒤 문제가 생기면 EEPROM 초기화가 필요한 경우도 있습니다.

    10

    VIA와 QMK Firmware는 어떤 관계일까?

    VIA는 QMK와 완전히 별개의 펌웨어가 아닙니다. 일반적으로 VIA 지원 키보드는 QMK Firmware 안에 VIA 통신 기능이 포함된 형태로 빌드됩니다. VIA 웹 앱이나 데스크톱 앱은 키보드와 통신해 현재 키맵과 설정을 읽고 변경합니다.

    VIA 앱
    사용자 인터페이스에서 키 배치를 변경
    “`
    VIA 통신 기능
    QMK 내부에서 설정 읽기와 쓰기 요청을 처리
    EEPROM
    변경된 키맵과 설정을 비휘발성 영역에 저장
    “`

    VIA에서 키를 변경할 때마다 QMK 소스 코드의 keymap.c가 수정되는 것은 아닙니다. 펌웨어 안에 준비된 동적 키맵 저장 영역의 값이 바뀌고, QMK는 스캔 과정에서 해당 값을 참조합니다. 반면 소스 코드로 직접 빌드한 키맵은 컴파일 시 펌웨어 프로그램에 포함됩니다.

    구분 QMK 소스 키맵 VIA 동적 키맵
    변경 방법 소스 수정 후 다시 컴파일하고 플래싱 VIA 화면에서 즉시 변경
    저장 위치 펌웨어 플래시 이미지 EEPROM 또는 대응되는 저장 영역
    자유도 사용자 코드와 고급 기능까지 구현 가능 펌웨어가 미리 허용한 범위에서 변경
    적합한 사용자 고급 커스텀 기능과 직접 개발이 필요한 사용자 코드 없이 빠르게 키 배치를 변경하려는 사용자
    11

    STM32와 RP2040에서는 무엇이 달라질까?

    QMK의 상위 구조는 MCU가 달라져도 비슷하게 유지됩니다. 사용자는 동일한 방식으로 키보드 폴더, 키맵, 레이어와 기능을 구성할 수 있습니다. 하지만 하드웨어에 가까운 하위 계층에서는 MCU 종류에 따라 빌드 시스템, 드라이버, 부트로더, 플래싱 방식과 주변 장치 설정이 달라질 수 있습니다.

    비교 항목 STM32 계열 RP2040 계열
    프로세서 구조 제품군에 따라 다양한 ARM Cortex-M 코어 사용 듀얼 코어 ARM Cortex-M0+ 기반
    저장 구조 MCU 내부 플래시를 사용하는 모델이 많음 외부 QSPI 플래시를 사용하는 구성이 일반적
    펌웨어 파일 부트로더에 따라 BIN, HEX, DFU 방식 등이 사용됨 UF2 파일을 드라이브에 복사하는 방식이 널리 사용됨
    저수준 지원 QMK의 하드웨어 추상화 계층과 지원 프레임워크 사용 RP2040용 드라이버와 하드웨어 설정 사용
    키맵 작성법 대부분 동일한 QMK 키코드와 레이어 문법 사용 대부분 동일한 QMK 키코드와 레이어 문법 사용

    즉, 사용자가 보는 QMK의 상위 인터페이스는 최대한 공통으로 유지되고, MCU별 차이는 하드웨어 추상화 계층 아래에서 처리됩니다. 이 구조 덕분에 같은 QMK 기능을 서로 다른 MCU 기반 키보드에도 비교적 일관된 방식으로 적용할 수 있습니다.

    중요한 해석

    STM32와 RP2040의 차이는 단순히 처리 속도만의 문제가 아닙니다. 플래시 구조, 부트로더, USB 구현, 사용 가능한 핀과 주변 장치가 다르므로 키보드 PCB 설계와 펌웨어 설정도 함께 달라집니다.

    12

    QMK Firmware 구조를 한눈에 정리하면

    소스 구조
    QMK 공통 코드, MCU 지원 코드, 키보드 정의와 사용자 키맵으로 나뉩니다.
    “`
    빌드 과정
    설정 파일과 C 소스가 전처리, 컴파일, 링크 과정을 거쳐 펌웨어가 됩니다.
    실행 구조
    초기화 후 매트릭스 스캔과 입력 처리를 빠르게 반복합니다.
    저장 구조
    펌웨어 코드는 플래시에, 변경 가능한 설정은 EEPROM 계열 영역에 저장됩니다.
    VIA 연동
    QMK의 동적 키맵 기능을 이용해 컴파일 없이 키 배치를 변경합니다.
    MCU 차이
    상위 키맵 구조는 비슷하지만 저수준 드라이버와 플래싱 방식은 달라집니다.
    “`
    FINAL INSIGHT

    QMK는 키맵 파일 하나가 아니라 계층화된 펌웨어 플랫폼입니다

    QMK Firmware는 키 위치를 문자로 바꾸는 단순한 변환표가 아닙니다. 키보드 하드웨어 정의, MCU 제어, 매트릭스 스캔, 키 이벤트 처리, USB HID 통신, 저장 장치 관리와 사용자 기능을 하나의 구조 안에서 연결합니다. 사용자는 상위 키맵과 기능 설정을 중심으로 작업하지만, 그 아래에서는 수많은 공통 모듈과 하드웨어 계층이 함께 동작합니다.

    자주 묻는 질문

    Q1. QMK를 사용하려면 반드시 C 언어를 알아야 하나요?

    기본적인 키맵 변경은 기존 예제를 수정하거나 QMK Configurator를 이용해도 가능합니다. 다만 사용자 키코드, 매크로, 상태 조건과 고급 기능을 직접 구현하려면 C 문법과 QMK의 이벤트 구조를 이해하는 것이 도움이 됩니다.

    “`

    Q2. keymap.c만 수정하면 모든 기능을 구현할 수 있나요?

    많은 사용자 기능은 keymap.c에서 구현할 수 있지만, 하드웨어 핀 설정이나 기능 활성화에는 config.h, rules.mk, info.json 등의 수정이 필요할 수 있습니다. 키보드 자체의 구조를 바꾸는 작업은 keyboard.c나 하드웨어 정의 파일까지 확인해야 합니다.

    Q3. VIA에서 바꾼 키맵은 펌웨어를 다시 설치하면 사라지나요?

    펌웨어 플래싱 방식과 EEPROM 처리 여부에 따라 달라집니다. 동적 키맵 정보가 저장된 EEPROM 영역이 유지되면 이전 설정이 남을 수 있고, EEPROM을 초기화하면 기본 키맵으로 돌아갈 수 있습니다.

    Q4. QMK의 폴더가 복잡한 이유는 무엇인가요?

    수많은 키보드와 MCU를 하나의 프로젝트에서 지원하기 때문입니다. 공통 기능은 재사용하고, 키보드별 차이와 사용자 키맵은 별도 계층으로 분리해 중복을 줄이는 구조입니다.

    Q5. MCU가 바뀌면 keymap.c도 전부 다시 작성해야 하나요?

    동일한 레이아웃 매크로와 QMK 기능이 지원된다면 키맵의 상당 부분을 재사용할 수 있습니다. 다만 핀 구성, 부트로더, 저장 방식과 MCU 전용 기능은 새 하드웨어에 맞게 조정해야 합니다.

    “`

    함께 보면 좋은 글

    공식 자료

    Sources

    • QMK Firmware Documentation, QMK Project
    • QMK Firmware Source Repository, GitHub
    • QMK Keyboard Metadata and info.json Reference
    • QMK Configuration Options Reference
    LINK&TEM 한 줄 정리

    QMK Firmware는 키보드 설정 파일, 공통 기능, MCU 제어 코드와 사용자 키맵을 계층적으로 결합해 하나의 실행 가능한 펌웨어로 만드는 구조입니다.

    7

    전원이 켜진 뒤 QMK Firmware는 어떻게 동작할까?

    컴파일된 QMK Firmware가 키보드의 마이크로컨트롤러에 기록되면, 소스 코드의 파일 구조는 하나의 실행 가능한 펌웨어 이미지로 바뀝니다. 사용자가 키보드에 전원을 연결했을 때 마이크로컨트롤러는 플래시 메모리에 저장된 프로그램을 읽고 초기화 과정을 시작합니다.

    STEP 1
    전원 인가
    USB 또는 배터리에서 전원을 공급받습니다.
    “`
    STEP 2
    MCU 초기화
    클록, GPIO, 타이머와 통신 장치를 준비합니다.
    STEP 3
    QMK 초기화
    키맵, 레이어, 기능과 저장값을 불러옵니다.
    STEP 4
    반복 실행
    매트릭스를 스캔하고 키 입력을 처리합니다.
    “`

    초기화가 끝나면 QMK는 한 번 실행되고 종료되는 일반 프로그램처럼 동작하지 않습니다. 키보드가 켜져 있는 동안 매우 짧은 작업을 계속 반복하는 구조로 움직입니다. 이 반복 구간에서 스위치 상태 확인, 디바운스 처리, 키코드 변환, 레이어 판정, 매크로 실행, RGB 갱신, USB 보고서 전송 등이 순서대로 처리됩니다.

    핵심 포인트

    QMK의 중심은 특정 파일 하나가 아니라, 하드웨어 초기화와 키 입력 처리를 계속 연결하는 실행 흐름입니다. 키맵에 작성한 기능은 이 반복 흐름 안에서 조건에 맞을 때 호출됩니다.

    8

    매트릭스 스캔과 키코드 처리는 어떻게 연결될까?

    기계식 키보드의 스위치는 대부분 행과 열로 구성된 매트릭스 회로에 연결됩니다. QMK는 각 행과 열의 전기적 상태를 빠르게 확인해 어떤 스위치가 눌렸는지 판정합니다. 이때 확인된 위치는 곧바로 문자로 전송되는 것이 아니라 여러 처리 단계를 통과합니다.

    처리 단계 QMK가 하는 일 예시
    매트릭스 읽기 행과 열의 상태를 확인합니다. 2행 3열 스위치 눌림
    디바운스 접점 진동으로 발생한 불안정한 신호를 정리합니다. 한 번 누른 키가 여러 번 인식되는 현상 방지
    레이어 판정 현재 활성화된 레이어에서 해당 위치의 키코드를 찾습니다. 기본 레이어에서는 A, 기능 레이어에서는 F1
    이벤트 처리 일반 키, 모드탭, 매크로, 탭댄스 등의 동작을 실행합니다. 짧게 누르면 Esc, 길게 누르면 Ctrl
    HID 보고서 전송 처리 결과를 USB 또는 무선 HID 보고서로 호스트에 전달합니다. 운영체제가 키 입력을 수신

    따라서 키보드에서 물리적인 스위치 하나를 눌렀다고 해서 PC에 특정 문자가 고정적으로 전달되는 것은 아닙니다. 동일한 스위치 위치라도 현재 레이어, 조합 상태, 사용자 코드와 기능 설정에 따라 전혀 다른 결과가 만들어질 수 있습니다. 이것이 QMK 기반 키보드가 일반적인 고정형 펌웨어보다 유연한 이유입니다.

    9

    Flash와 EEPROM은 어떤 역할을 나눠 가질까?

    QMK Firmware를 이해할 때 자주 혼동되는 부분이 플래시 메모리와 EEPROM입니다. 두 저장 영역 모두 전원을 꺼도 정보가 유지될 수 있지만, 저장되는 데이터의 성격과 갱신 방식이 다릅니다.

    FLASH MEMORY

    펌웨어 프로그램 저장

    컴파일된 QMK 코드, 키맵, 활성화된 기능과 하드웨어 제어 로직이 포함됩니다. 소스 코드를 수정한 뒤 펌웨어를 다시 플래싱하면 이 영역의 프로그램이 교체됩니다.

    “`
    EEPROM

    사용자 설정값 저장

    기본 레이어, RGB 설정, 오디오 설정, VIA에서 변경한 키맵처럼 실행 중 바뀔 수 있는 값을 저장하는 데 사용됩니다. MCU에 따라 별도 EEPROM 대신 플래시 일부를 가상 EEPROM처럼 사용할 수도 있습니다.

    “`
    구분 Flash EEPROM 또는 가상 EEPROM
    주요 내용 실행할 펌웨어 코드 변경 가능한 설정값
    갱신 시점 펌웨어 플래싱 시 설정 변경 또는 저장 명령 실행 시
    대표 예시 keymap.c, 기능 코드, USB 처리 코드 VIA 키맵, 기본 레이어, RGB 밝기
    초기화 영향 다른 펌웨어를 플래싱하면 프로그램 변경 EEPROM 초기화 명령으로 설정값 삭제 가능
    주의할 점

    새 펌웨어를 플래싱했는데도 VIA 키맵이나 RGB 설정이 이전 상태로 남아 있다면, 플래시의 펌웨어와 EEPROM의 설정값이 별도로 유지되고 있기 때문일 수 있습니다. 구조가 크게 바뀐 펌웨어를 설치한 뒤 문제가 생기면 EEPROM 초기화가 필요한 경우도 있습니다.

    10

    VIA와 QMK Firmware는 어떤 관계일까?

    VIA는 QMK와 완전히 별개의 펌웨어가 아닙니다. 일반적으로 VIA 지원 키보드는 QMK Firmware 안에 VIA 통신 기능이 포함된 형태로 빌드됩니다. VIA 웹 앱이나 데스크톱 앱은 키보드와 통신해 현재 키맵과 설정을 읽고 변경합니다.

    VIA 앱
    사용자 인터페이스에서 키 배치를 변경
    “`
    VIA 통신 기능
    QMK 내부에서 설정 읽기와 쓰기 요청을 처리
    EEPROM
    변경된 키맵과 설정을 비휘발성 영역에 저장
    “`

    VIA에서 키를 변경할 때마다 QMK 소스 코드의 keymap.c가 수정되는 것은 아닙니다. 펌웨어 안에 준비된 동적 키맵 저장 영역의 값이 바뀌고, QMK는 스캔 과정에서 해당 값을 참조합니다. 반면 소스 코드로 직접 빌드한 키맵은 컴파일 시 펌웨어 프로그램에 포함됩니다.

    구분 QMK 소스 키맵 VIA 동적 키맵
    변경 방법 소스 수정 후 다시 컴파일하고 플래싱 VIA 화면에서 즉시 변경
    저장 위치 펌웨어 플래시 이미지 EEPROM 또는 대응되는 저장 영역
    자유도 사용자 코드와 고급 기능까지 구현 가능 펌웨어가 미리 허용한 범위에서 변경
    적합한 사용자 고급 커스텀 기능과 직접 개발이 필요한 사용자 코드 없이 빠르게 키 배치를 변경하려는 사용자
    11

    STM32와 RP2040에서는 무엇이 달라질까?

    QMK의 상위 구조는 MCU가 달라져도 비슷하게 유지됩니다. 사용자는 동일한 방식으로 키보드 폴더, 키맵, 레이어와 기능을 구성할 수 있습니다. 하지만 하드웨어에 가까운 하위 계층에서는 MCU 종류에 따라 빌드 시스템, 드라이버, 부트로더, 플래싱 방식과 주변 장치 설정이 달라질 수 있습니다.

    비교 항목 STM32 계열 RP2040 계열
    프로세서 구조 제품군에 따라 다양한 ARM Cortex-M 코어 사용 듀얼 코어 ARM Cortex-M0+ 기반
    저장 구조 MCU 내부 플래시를 사용하는 모델이 많음 외부 QSPI 플래시를 사용하는 구성이 일반적
    펌웨어 파일 부트로더에 따라 BIN, HEX, DFU 방식 등이 사용됨 UF2 파일을 드라이브에 복사하는 방식이 널리 사용됨
    저수준 지원 QMK의 하드웨어 추상화 계층과 지원 프레임워크 사용 RP2040용 드라이버와 하드웨어 설정 사용
    키맵 작성법 대부분 동일한 QMK 키코드와 레이어 문법 사용 대부분 동일한 QMK 키코드와 레이어 문법 사용

    즉, 사용자가 보는 QMK의 상위 인터페이스는 최대한 공통으로 유지되고, MCU별 차이는 하드웨어 추상화 계층 아래에서 처리됩니다. 이 구조 덕분에 같은 QMK 기능을 서로 다른 MCU 기반 키보드에도 비교적 일관된 방식으로 적용할 수 있습니다.

    중요한 해석

    STM32와 RP2040의 차이는 단순히 처리 속도만의 문제가 아닙니다. 플래시 구조, 부트로더, USB 구현, 사용 가능한 핀과 주변 장치가 다르므로 키보드 PCB 설계와 펌웨어 설정도 함께 달라집니다.

    12

    QMK Firmware 구조를 한눈에 정리하면

    소스 구조
    QMK 공통 코드, MCU 지원 코드, 키보드 정의와 사용자 키맵으로 나뉩니다.
    “`
    빌드 과정
    설정 파일과 C 소스가 전처리, 컴파일, 링크 과정을 거쳐 펌웨어가 됩니다.
    실행 구조
    초기화 후 매트릭스 스캔과 입력 처리를 빠르게 반복합니다.
    저장 구조
    펌웨어 코드는 플래시에, 변경 가능한 설정은 EEPROM 계열 영역에 저장됩니다.
    VIA 연동
    QMK의 동적 키맵 기능을 이용해 컴파일 없이 키 배치를 변경합니다.
    MCU 차이
    상위 키맵 구조는 비슷하지만 저수준 드라이버와 플래싱 방식은 달라집니다.
    “`
    FINAL INSIGHT

    QMK는 키맵 파일 하나가 아니라 계층화된 펌웨어 플랫폼입니다

    QMK Firmware는 키 위치를 문자로 바꾸는 단순한 변환표가 아닙니다. 키보드 하드웨어 정의, MCU 제어, 매트릭스 스캔, 키 이벤트 처리, USB HID 통신, 저장 장치 관리와 사용자 기능을 하나의 구조 안에서 연결합니다. 사용자는 상위 키맵과 기능 설정을 중심으로 작업하지만, 그 아래에서는 수많은 공통 모듈과 하드웨어 계층이 함께 동작합니다.

    자주 묻는 질문

    Q1. QMK를 사용하려면 반드시 C 언어를 알아야 하나요?

    기본적인 키맵 변경은 기존 예제를 수정하거나 QMK Configurator를 이용해도 가능합니다. 다만 사용자 키코드, 매크로, 상태 조건과 고급 기능을 직접 구현하려면 C 문법과 QMK의 이벤트 구조를 이해하는 것이 도움이 됩니다.

    “`

    Q2. keymap.c만 수정하면 모든 기능을 구현할 수 있나요?

    많은 사용자 기능은 keymap.c에서 구현할 수 있지만, 하드웨어 핀 설정이나 기능 활성화에는 config.h, rules.mk, info.json 등의 수정이 필요할 수 있습니다. 키보드 자체의 구조를 바꾸는 작업은 keyboard.c나 하드웨어 정의 파일까지 확인해야 합니다.

    Q3. VIA에서 바꾼 키맵은 펌웨어를 다시 설치하면 사라지나요?

    펌웨어 플래싱 방식과 EEPROM 처리 여부에 따라 달라집니다. 동적 키맵 정보가 저장된 EEPROM 영역이 유지되면 이전 설정이 남을 수 있고, EEPROM을 초기화하면 기본 키맵으로 돌아갈 수 있습니다.

    Q4. QMK의 폴더가 복잡한 이유는 무엇인가요?

    수많은 키보드와 MCU를 하나의 프로젝트에서 지원하기 때문입니다. 공통 기능은 재사용하고, 키보드별 차이와 사용자 키맵은 별도 계층으로 분리해 중복을 줄이는 구조입니다.

    Q5. MCU가 바뀌면 keymap.c도 전부 다시 작성해야 하나요?

    동일한 레이아웃 매크로와 QMK 기능이 지원된다면 키맵의 상당 부분을 재사용할 수 있습니다. 다만 핀 구성, 부트로더, 저장 방식과 MCU 전용 기능은 새 하드웨어에 맞게 조정해야 합니다.

    “`

    함께 보면 좋은 글

    공식 자료

    Sources

    • QMK Firmware Documentation, QMK Project
    • QMK Firmware Source Repository, GitHub
    • QMK Keyboard Metadata and info.json Reference
    • QMK Configuration Options Reference
    LINK&TEM 한 줄 정리

    QMK Firmware는 키보드 설정 파일, 공통 기능, MCU 제어 코드와 사용자 키맵을 계층적으로 결합해 하나의 실행 가능한 펌웨어로 만드는 구조입니다.