본문 바로가기
Model Lightening/MCU

MCU 입문 [1] - MCU란 무엇인가?

by Sangwoo Seo 2026. 2. 27.
Renesas Engineer School 내용을 기반으로 공부한 내용을 정리했습니다.

 

https://www.renesas.com/en/support/engineer-school/mcu-01-basic-structure-operation


들어가며

스마트폰, 냉장고, 세탁기, 자동차 에어백 제어, 어린이 장난감의 깜빡이는 LED까지. 우리 주변의 거의 모든 전자 기기에는 MCU(Microcontroller Unit) 가 들어 있습니다. 그런데 정작 MCU가 뭔지, 내부가 어떻게 생겼는지 설명하려면 막히는 경우가 많습니다. 이 글에서는 MCU의 구조와 동작 원리를 정리하고, 더 나아가 요즘 관심이 높아지는 MCU 위에서의 AI 추론이 왜 어려운지, 그리고 어떻게 해결하는지까지 함께 정리해보겠습니다.


MCU란 무엇인가?

MCU는 CPU, 메모리, 주변장치(Peripherals)를 하나의 칩에 통합한 소형 컴퓨터입니다. 일반 컴퓨터는 CPU 칩, 메모리 모듈, 스토리지, 주변 부품이 각각 분리되어 있지만, MCU는 이 모든 것이 하나의 실리콘 칩 안에 들어 있습니다.

구분 PC MCU
CPU 별도 프로세서 칩 칩 내부에 통합
메모리 외부 RAM/SSD 칩 내부에 통합
주변장치 별도 부품 조합 칩 내부에 통합
OS Windows, Linux 등 없거나 경량 RTOS
목적 범용 특정 제어 작업
소비 전력 수십~수백 W 수 mW~수백 mW

 

MCU와 일반 컴퓨터의 본질적인 차이는 목적에 있습니다. PC는 다양한 작업을 수행하는 범용 컴퓨터이고, MCU는 하나의 특정한 일을 계속 반복하는 제어기입니다. 세탁기 MCU는 세탁기만 제어하고, 에어백 MCU는 충격 감지와 에어백 전개만 담당합니다.

굳이 MCU를 쓰는 이유는?

간단한 예시로 시작해봅시다. 버튼을 누르면 LED가 켜지는 회로가 있다고 하면, MCU 없이도 LED + 스위치 + 저항 3개 부품으로 만들 수 있습니다.

MCU가 없는 LED 램프 회로

 

그런데 여기에 요구사항이 하나 추가됩니다. "버튼을 누르고 정확히 3초 후에 LED가 1초 간격으로 깜빡이게 해달라." MCU 없는 회로는 타이머 IC, 로직 IC 등을 추가하고 회로 자체를 설계부터 다시 해야 합니다. 반면 MCU가 있으면 프로그램만 수정하면 됩니다. 하드웨어는 그대로 두고요. 이게 MCU를 쓰는 핵심 이유입니다. 유연성입니다.

MCU를 사용한 LED 램프 회로


MCU의 세 가지 구성요소

MCU 내부는 크게 세 가지로 나뉩니다.

MCU 구조

Renesas는 이 세 가지를 이렇게 비유합니다.

  • CPU = 뇌 (생각하는 주체)
  • Memory = 기억 (정보를 저장하는 곳)
  • Peripheral = 신경계 (보고, 듣고, 손발을 움직이는 것)

각각 하나씩 살펴보겠습니다.


CPU — 명령어를 순서대로 실행하는 장치

CPU는 메모리에 저장된 프로그램을 한 줄씩 읽어서 실행하는 장치입니다. 내부는 네 가지 요소로 구성됩니다.

CPU의 역할

Program Counter (PC)

PC는 "다음에 실행할 명령어의 주소"를 저장하는 레지스터입니다. CPU가 켜지면 PC는 0000번지에서 시작하고, 명령어 하나를 실행할 때마다 자동으로 다음 번지로 넘어갑니다. 특별한 점프 명령이 없으면 항상 순차 실행입니다.

Instruction Decoder

메모리에서 읽어온 명령어는 0과 1로 이루어진 이진 코드입니다. Instruction Decoder는 이 코드를 해석해서 "덧셈을 하라", "메모리에서 데이터를 읽어라" 같은 실제 동작으로 변환합니다.

ALU (Arithmetic Logic Unit)

ALU는 실제 연산을 수행하는 회로입니다. 덧셈, 뺄셈, 곱셈 같은 산술 연산과 AND, OR, 비트 시프트 같은 논리 연산을 처리합니다. Instruction Decoder의 지시를 받아 동작합니다.

CPU 내부 레지스터

레지스터는 CPU 내부의 빠른 임시 저장소입니다. ALU가 연산할 때 메모리에서 직접 데이터를 가져오지 않고, 먼저 레지스터에 복사한 뒤 연산합니다. 이렇게 하는 이유는 속도 때문입니다. 메모리 접근보다 레지스터 접근이 훨씬 빠르기 때문에, 자주 쓰는 값은 레지스터에 올려두고 사용합니다.

  • 범용 레지스터 — 산술/논리 연산의 중간 결과 저장
  • 플래그 레지스터 — 연산 결과의 상태 저장 (올림수 발생 여부 등)

CPU 동작 예시 — 3 + 4를 계산하려면

메모리에 아래와 같이 저장되어 있다고 가정합니다.

주소 명령어
0000 0100번지의 값을 레지스터 1에 저장
0001 0101번지의 값을 레지스터 2에 저장
0002 레지스터 1 + 레지스터 2 → 레지스터 1에 저장

 

주소 데이터
0100 3
0101 4

 

실행 순서는 다음과 같습니다.

  1. PC=0000 → 명령 실행 → 레지스터 1 = 3 → PC 자동으로 0001로 증가
  2. PC=0001 → 명령 실행 → 레지스터 2 = 4 → PC 자동으로 0002로 증가
  3. PC=0002 → 명령 실행 → 레지스터 1 = 3 + 4 = 7

이처럼 CPU는 매우 단순한 명령어를 정해진 순서대로 하나씩 실행하는 기계입니다. 각 명령어 자체는 단순하지만, 이 명령어들을 길게 조합하면 복잡한 동작을 만들어낼 수 있습니다.

💡 AI를 MCU에서 돌리면 — CPU 관점

문제

AI 추론은 본질적으로 수백만~수십억 번의 곱셈과 덧셈, 즉 행렬 연산의 연속입니다. MCU의 CPU는 위에서 본 것처럼 명령어를 한 번에 하나씩 처리합니다. MobileNetV2처럼 비교적 가벼운 모델도 약 300M번의 곱셈이 필요한데, MCU의 CPU로 이걸 순차 처리하면 추론 시간이 수십 초에 달하게 됩니다. 실시간 처리가 필요한 음성 인식이나 객체 감지에는 사용할 수 없는 수준입니다.

해결 방향

이 문제를 해결하는 방향은 크게 세 가지입니다.

 

첫 번째는 SIMD 명령어 활용입니다. ARM Cortex-M55에 탑재된 Helium(MVE) 명령어셋은 한 클럭에 여러 데이터를 동시에 처리합니다. 예를 들어 8개의 INT16 값을 하나의 명령어로 동시에 곱할 수 있어, 기존 Cortex-M4 대비 AI 연산 성능이 최대 15배 향상됩니다.

 

두 번째는 모델 경량화입니다. 연산량 자체를 줄이는 방식으로, FP32 → INT8 양자화만으로도 곱셈 연산량이 4분의 1로 감소합니다. Pruning으로 불필요한 가중치를 제거하면 추가로 줄일 수 있습니다.

 

세 번째는 NPU 오프로드입니다. MCU가 직접 추론하지 않고 Hailo, STM32N6 내장 NPU 같은 AI 전용 하드웨어에 연산을 맡기는 방식입니다. MCU는 시스템 제어만 담당하고, 무거운 행렬 연산은 NPU에서 병렬로 처리합니다.


Memory — Flash와 SRAM

MCU의 메모리는 역할이 다른 두 종류로 나뉩니다.

Flash (비휘발성)

Flash는 프로그램 코드를 저장하는 곳입니다. 전원이 꺼져도 내용이 유지됩니다. 과거에는 ROM(Read-Only Memory)을 사용했는데, ROM은 공장 출하 후 내용을 변경할 수 없었습니다. 현대 MCU가 Flash를 사용하는 이유는 ROM과 달리 내용을 다시 쓸 수 있기 때문입니다. 펌웨어 업데이트가 가능한 것도 이 덕분입니다.

 

크기는 MCU에 따라 수 KB에서 수 MB까지 다양합니다.

SRAM (휘발성)

SRAM은 프로그램이 실행되는 동안 변수, 스택, 힙을 저장하는 곳입니다. 전원이 꺼지면 내용이 사라집니다. Flash보다 훨씬 작은 용량을 가지며, 일반적으로 수 KB에서 수백 KB 수준입니다.

 

DRAM(일반 PC의 RAM)이 아닌 SRAM을 쓰는 이유는 속도 때문입니다. DRAM은 주기적으로 데이터를 다시 써줘야 하는(refresh) 특성이 있어 회로가 복잡하고, 고속 로직 회로와 같은 웨이퍼에 집적하기 어렵습니다. SRAM은 구조가 단순하고 빠르지만 집적 면적당 용량이 작다는 단점이 있습니다. MCU처럼 작은 칩에서는 용량보다 속도와 집적 편의성을 우선하기 때문에 SRAM을 선택합니다.

💡 AI를 MCU에서 돌리면 — Memory 관점

문제

AI 모델을 MCU에 올리면 두 가지 메모리 문제가 동시에 발생합니다.

 

첫 번째는 Flash 용량 문제입니다. MobileNetV2의 파라미터는 FP32 기준 약 14MB입니다. 그런데 대부분의 MCU Flash 용량은 수백 KB에서 수 MB 수준이라, 모델 자체를 올리기도 빠듯합니다.

 

두 번째는 SRAM 병목입니다. 모델 파라미터는 Flash에 올리더라도, 추론 중에는 각 레이어의 중간 결과값(Activation)을 SRAM에 저장해야 합니다. MobileNetV2를 예로 들면, FP32 기준으로 추론에 필요한 SRAM이 약 1MB 이상 필요한데, 일반적인 MCU의 SRAM은 이를 감당하기 어렵습니다.

해결 방향

가장 직접적인 해결책은 양자화입니다. FP32(4 bytes) → INT8(1 byte)로 바꾸면 Flash 사용량은 4분의 1로, SRAM 사용량도 4분의 1로 줄어듭니다. MobileNetV2 기준으로 파라미터 메모리가 14MB에서 3.5MB로 감소합니다.

 

SRAM 병목은 In-place Inference 방식으로 추가 완화할 수 있습니다. TensorFlow Lite for Microcontrollers(TFLM)이나 Edge Impulse SDK 같은 프레임워크는 각 레이어의 Activation 버퍼를 순차적으로 재사용하는 방식으로 SRAM 사용량을 최소화합니다. 모든 레이어의 Activation을 동시에 메모리에 올리지 않고, 현재 처리 중인 레이어의 것만 유지하는 방식입니다.

 

더 근본적인 접근은 2-stage 아키텍처입니다. 수백 KB짜리 소형 Wake Word 감지 모델만 MCU에서 항상 실행하고, 키워드가 감지되면 상위 프로세서(Jetson, 클라우드)에 오디오를 넘기는 방식으로 역할을 분리합니다. MCU의 메모리 제약 안에서 현실적으로 AI를 적용할 수 있는 설계입니다.


Peripheral — MCU를 실제 제어기로 만들어주는 것

CPU와 메모리만 있으면 MCU는 내부에서만 계산하는 기계일 뿐입니다. 외부 세계와 신호를 주고받으려면 Peripheral이 필요합니다.

주변 장치 역할 예시
GPIO 디지털 입출력 LED 제어, 버튼 입력
ADC 아날로그 → 디지털 변환 온도 센서, 마이크
Timer 시간 측정, PWM 생성 모터 속도 제어
UART / SPI / I2C 직렬 통신 센서, 디스플레이 연결
DMA CPU 없이 메모리 간 데이터 전송 오디오 버퍼링
인터럽트 컨트롤러 이벤트 기반 처리 버튼 눌림 즉시 감지

 

Peripheral의 종류와 스펙이 MCU 선택의 실질적인 기준이 됩니다. 예를 들어 음성 처리가 필요하다면 I2S(디지털 오디오 인터페이스)와 ADC 성능을 먼저 보고, 모터 제어가 필요하다면 Timer와 PWM 출력 채널 수를 봅니다.

GPIO (General Purpose Input / Output)

가장 기본적인 주변장치입니다. MCU의 핀 하나하나를 0(LOW, 0V) 또는 1(HIGH, 5V/3.3V)로 읽거나 쓸 수 있는 디지털 입출력 핀입니다.

  • Output 방향: MCU가 핀에 1을 쓰면 전압이 HIGH가 되고, 거기에 연결된 LED가 켜집니다. 0을 쓰면 꺼집니다.
  • Input 방향: 버튼이 눌리면 핀에 들어오는 전압이 바뀝니다. MCU가 이 값을 읽어서 "눌렸다 / 안 눌렸다"를 판단합니다.

핵심은 디지털, 즉 0과 1만 다룬다는 점입니다. 중간값은 없습니다.

ADC (Analog to Digital Converter)

GPIO가 0과 1만 다룬다면, ADC는 연속적인 아날로그 신호를 숫자로 변환합니다.

 

예를 들어 온도 센서는 온도에 따라 0V~3.3V 사이의 전압을 출력합니다. 25도일 때 1.2V, 30도일 때 1.5V처럼요. MCU는 이 전압값 자체를 이해할 수 없으므로, ADC가 이 전압을 0~4095 사이의 숫자(12bit 기준)로 변환해줍니다. 1.2V → 1489, 1.5V → 1862 이런 식입니다. 마이크도 마찬가지입니다.

 

소리는 공기 진동이고, 마이크는 이를 전압 변화로 바꿉니다. ADC가 이 전압을 숫자로 변환해야 MCU가 음성 데이터로 처리할 수 있습니다.

Timer

Timer는 MCU 내부에서 시간을 재는 카운터입니다. 클럭 신호에 맞춰 숫자를 1씩 올리다가, 설정한 값에 도달하면 특정 동작을 수행합니다.

활용 방법이 두 가지입니다.

  • 시간 측정: "이 신호가 들어온 지 얼마나 됐지?"를 카운터로 측정합니다. 초음파 센서가 신호를 보내고 돌아오는 시간을 재서 거리를 계산하는 방식이 대표적입니다.
  • PWM(Pulse Width Modulation) 생성: 핀을 빠르게 켰다 껐다 하면서 평균 전압을 조절하는 방식입니다. LED 밝기 조절이나 모터 속도 제어에 씁니다. 예를 들어 50% 듀티 사이클이면 절반은 HIGH, 절반은 LOW로 출력해서 모터가 절반 속도로 회전합니다.

UART / SPI / I2C

세 가지 모두 직렬 통신 프로토콜입니다. MCU가 다른 칩(센서, 디스플레이, 다른 MCU 등)과 데이터를 주고받는 방법입니다. 각각 선 수, 속도, 용도가 다릅니다.

  • UART: 선 2개(TX, RX)로 1:1 통신합니다. 속도는 느리지만 구조가 단순해서 디버깅 로그 출력이나 GPS 모듈 연결에 자주 씁니다. PC와 MCU를 연결할 때도 대부분 UART를 씁니다.
  • SPI: 선 4개(MOSI, MISO, SCK, CS)를 써서 UART보다 빠릅니다. 1:N 통신이 가능하고, 디스플레이나 SD카드 같이 데이터 전송량이 많은 장치에 씁니다.
  • I2C: 선 2개(SDA, SCL)만으로 여러 장치를 연결할 수 있습니다. 각 장치마다 고유 주소가 있어서 MCU가 "0x48번 장치야, 온도 데이터 줘"처럼 주소로 호출합니다. 속도는 SPI보다 느리지만 배선이 간단해서 센서 여러 개를 연결할 때 유리합니다.

DMA (Direct Memory Access)

DMA를 이해하려면 먼저 DMA 없이 데이터를 어떻게 옮기는지 봐야 합니다.

  • DMA 없이: 마이크에서 데이터가 들어올 때마다 CPU가 직접 "데이터 읽어서 메모리에 써" 작업을 반복합니다. CPU가 이 단순 반복 작업에 묶여 있는 동안 AI 추론은 못 합니다.
  • DMA 있으면: "마이크 데이터를 이 메모리 주소에 자동으로 쌓아줘"라고 DMA에 설정만 해두면, CPU는 아무것도 안 해도 됩니다. DMA가 알아서 데이터를 메모리로 옮기고, 버퍼가 가득 차면 CPU에 인터럽트로 알립니다. CPU는 그때만 깨어나서 처리합니다.

쉽게 말해 CPU의 단순 반복 잡일을 대신해주는 전담 하드웨어입니다.

인터럽트 컨트롤러

인터럽트는 "지금 하던 일을 잠깐 멈추고 이걸 먼저 처리해" 라는 신호입니다. 인터럽트 없이 버튼 입력을 감지하려면 CPU가 "버튼 눌렸나? 아니. 버튼 눌렸나? 아니. 버튼 눌렸나?..."를 계속 반복해야 합니다. 이게 폴링(Polling) 방식인데, CPU 시간을 낭비하고 반응 속도도 느립니다.

 

인터럽트 방식에서는 CPU가 다른 작업을 하다가, 버튼이 눌리는 순간 하드웨어적으로 신호가 발생합니다. CPU는 즉시 하던 일을 멈추고 버튼 처리 코드를 실행한 뒤 원래 작업으로 돌아옵니다. 반응 속도가 빠르고 CPU 낭비도 없습니다. 인터럽트 컨트롤러는 여러 인터럽트 신호(버튼, DMA 완료, Timer 만료 등)가 동시에 들어올 때 우선순위를 정해서 CPU에 순서대로 전달하는 관리자 역할을 합니다.

💡 AI를 MCU에서 돌리면 — Peripheral 관점

문제

음성 AI 파이프라인을 MCU에서 구현하면 Peripheral 활용이 핵심 과제가 됩니다.

 

마이크(I2S/PDM)에서 오디오를 받아 → FFT로 Mel-Spectrogram을 추출하고 → AI 추론까지 해야 하는데, 이 과정을 CPU만으로 직렬 처리하면 16kHz 샘플링 기준으로 20ms마다 320개의 샘플이 쌓입니다. 이 320개를 FFT 처리하고 추론까지 20ms 안에 끝내야 하는데, CPU가 오디오 수신과 연산을 동시에 하면 타이밍을 맞추기 어렵습니다.

해결 방향

이 문제에서 DMA가 핵심 역할을 합니다. DMA를 설정해두면 CPU 개입 없이 마이크 데이터가 자동으로 메모리 버퍼에 쌓입니다. 버퍼가 가득 차면 인터럽트로 CPU에 알리고, CPU는 그때 비로소 깨어나 FFT와 AI 추론을 수행합니다. 오디오 수신과 연산이 병렬로 이루어지기 때문에 CPU를 AI 추론에만 집중시킬 수 있습니다.

 

FFT 연산 자체는 CMSIS-DSP 라이브러리로 가속합니다. ARM이 Cortex-M용으로 최적화한 DSP 라이브러리로, 순수 C 코드 대비 수배 빠른 FFT 연산이 가능합니다.

 

전체 파이프라인 설계는 슬라이딩 윈도우 방식으로 구성합니다. 오디오를 20ms 프레임 단위로 나눠 처리하되, 각 프레임의 FFT + 추론이 다음 프레임 도착 전에 완료되도록 타이밍을 설계합니다. 만약 추론 시간이 20ms를 넘으면 프레임이 누락되므로, 이 타이밍을 맞추는 것이 실시간 처리의 핵심입니다.


정리

이번 글에서 공부한 내용을 요약하면 다음과 같습니다.

  • MCU는 CPU + Memory + Peripheral이 하나의 칩에 통합된 소형 컴퓨터입니다. 범용 컴퓨터와 달리 특정 제어 작업을 반복 수행하도록 설계되어 있습니다.
  • CPU는 Program Counter → Instruction Decoder → ALU → 레지스터 순서로 명령어를 순차적으로 실행합니다. 각 명령어는 단순하지만, 조합하면 복잡한 동작을 만들어낼 수 있습니다.
  • Memory는 프로그램 코드를 저장하는 Flash(비휘발성)와 실행 중 데이터를 저장하는 SRAM(휘발성)으로 나뉩니다. SRAM은 특히 용량이 작아 AI 모델 적용 시 가장 큰 제약이 됩니다.
  • Peripheral은 GPIO, ADC, Timer, UART, DMA 등 외부 세계와 연결하는 인터페이스로, MCU 선택의 실질적인 기준입니다.
  • MCU에서 AI를 돌리는 건 CPU 연산 능력, SRAM 크기, 실시간 처리 타이밍이라는 세 가지 벽을 동시에 넘어야 합니다. 양자화, In-place Inference, DMA + 슬라이딩 윈도우 설계가 현실적인 해결책입니다