Microccontroller(MCU)는 single chip 위에 있는 소형 컴퓨터 시스템이다. MCU은 임베디드 애플리케이션을 타겟으로 하기 때문에, 데스크탑 컴퓨터에 비해 메모리, 속도, 외부 인터페이스 등 리소스가 매우 한정적이다.
Microcontroller은 일반적으로 다음 요소를 포함한다.
프로세서(CPU), 휘발성/비휘발성 메모리(SRAM, 플래시, EEPROM 등), 입출력 인터페이스(I/O), 주변 장치(ADC, DAC, 타이머 등), 클럭 유닛, 버스 인터페이스
위 모든 것이 하나의 칩에 내장되어 있어서, MCU은 흔히 SoC(System on Chip)이라고 불린다.

위 그림은 가장 간단한 구성이다. 실제 MCU은 위 그림보다 훨씬 복잡하다.
① CPU(중앙 처리 장치)
② 프로그램 메모리
③ 데이터 메모리(휘발성)
④ 입출력 인터페이스(I/O)
⑤ 주소 버스 / 데이터 버스
⑥ 클럭 유닛

위 그림은 STMicroelectronics의 STM32F407 마이크로컨트롤러이다. 중앙에는 ARM Cortex-M4 기반 CPU가 있다. 이 CPU는 ST에서 개발한 것이 아니라 ARM에서 개발하여 라이선스를 통해 ST가 사용하는 구조이다.
최대 속도는 180MHz로, 임베디드 애플리케이션에서는 매우 빠르다. 그리고 ST는 CPU 주위에 다양한 주변 장치를 추가했다.
① 연결 관련 주변장치: SPI, I2C, USB, CAN 등
② 아날로그 관련 장치: ADC, DAC, 온도센서 등
③ 제어 관련 장치: PWM, 타이머 등
④ 시스템 관련 장치: RTC(실시간 시계), PLL, 내부 RC 오실레이터
⑤ 내장 메모리:


Code 또는 Program Memory의 목적은 프로그램의 명령어와 상수 데이터를 저장하는 것이다.
마이크로컨트롤러 내에는 다양한 종류의 Code Memory가 구현되어 있다. 가장 간단하고 cost가 효율적인 Program Memory는 ROM이다.
① MPROM(Mask Programmable Read Only Memory)
② EPROM(Ultraviolet Erasable Programmable ROM)
③ EEPROM(Electrically Erasable Programmable ROM)
ROM 외에도 다른 Code Memory가 있는데, 그것은 OTP이다. 이는 한 번만 프로그래밍할 수 있는 메모리를 의미한다.
요즘 마이크로컨트롤러 계에서는 Flash Memory가 매우 인기 있다. Flash도 전기적으로 지울 수 있는 Programmable ROM이다.
EEPROM이든, Flash든, 둘 다 비휘발성이고 지우고 다시 쓸 수 있는 메모리라는 점에서는 같지만, 둘은 제작 기술이 완전히 다르고, 비용과 속도 측면에서도 차이가 존재한다.
따라서 오늘날 마이크로컨트롤러에서 Flash가 Code Memory로서 지배적으로 사용되고 있다.
Flash외에도 FRAM이라는 비휘발성 메모리가 존재한다. FRAM은 Ferroelectric(강유전체) Random Access Memory를 의미한다.
하지만 대부분의 STM32 Microcontroller는 이 메모리를 Code Memory로 사용하지 않는다. 이는 Flash보다 비싸기 때문이다.
그럼에도 FRAM는 Flash보다 접근 속도가 매우 빨라 쓰인다. 특히, TI의 MSP Microcontroller 중 일부는 FRAM을 Code Memory로 채택했다.

예를 들어, MSP430FR2422 Microcontroller의 Block Diagram을 보면, 이 Microcontroller에는 Flash 대신 FRAM을 사용한 것을 알 수 있으며, 그 크기는 8KB이다. 이 Microcontroller는 초저전력 애플리케이션을 공략하는 것임을 시사한다.

위 코드를 컴파일하여 .elf라는 실행파일을 얻을 수 있었다. 이 파일을 target(NUCLEO-F411RE)에 다운로드하였다.
이번에는 Memory Browsing을 통해 임베디드 보드의 Flash에 명령어가 정말로 저장되었는지 확인해보려고 한다. 이때 마이크로컨트롤러의 프로그램 메모리의 base address가 필요하다. 이는 레퍼런스 매뉴얼에서 알 수 있다.

위 그림을 통해, 임베디드 비휘발성 메모리 구성을 알 수 있다. 총 512KB 용량의 Flash 메모리이다. 그 외에 System Memory라고 부르는 ROM이 있다. 사용자는 이 ROM에 쓸 수 없다.
ST는 이 메모리에 boot loader 코드를 미리 넣어놓았다. 테이블을 참고했을 때, 0x0800_0000부터 0x0807_FFFF까지 프로그램 명령어를 저장할 수 있다. 코드를 다운로드하면, 0x0800_0000부터 코드가 쌓이기 시작한다.

이번에는 데이터 메모리를 살펴보겠다. 데이터 메모리는 SRAM이며, 그 내용을 확인하기 전에 우선적으로 base address을 알아야 한다.

앞서 했던 방식으로 memoy browsing을 하면 정상적으로 저장되었음을 알 수 있다.
<참고 자료>
Kiran Nayak, Microcontroller Embedded C Programming: Absolute Beginners, Udemy, 2025.05.
TI 社 MSP430FR2422 Microcontroller, https://www.ti.com/product/ko-kr/MSP430FR2422
STM32F411xC/E advanced Arm®-based 32-bit MCUs - Reference manual