그라운드 임베디드 유튜브 구독

노트 / 컴퓨터구조

메모리 맵: MCU의 모든 것은 주소가 있다

코드는 Flash에, 변수는 SRAM에, 주변장치 레지스터도 정해진 주소에 있습니다. 데이터시트의 메모리 맵 읽는 법.

GROUND EMBEDDED · 정리 노트컴퓨터구조 05메모리 맵주소영역STM32 예0x0800_0000코드 (Flash)프로그램과 const 데…0x2000_0000SRAM전역 변수, 스택, 힙

32비트 Cortex-M은 0x0000_0000부터 0xFFFF_FFFF까지 4GB의 주소 공간을 가집니다. 실제 메모리는 일부지만 영역마다 용도가 정해져 있습니다.

주소 영역 STM32 예
0x0800_0000 코드 (Flash) 프로그램과 const 데이터
0x2000_0000 SRAM 전역 변수, 스택, 힙
0x4000_0000 주변장치 GPIO, 타이머, UART 레지스터
0xE000_0000 코어 주변장치 NVIC, SysTick, 디버그

데이터시트 읽기

레퍼런스 매뉴얼의 메모리 맵 표에서 "GPIOA 0x4002_0000 ~ 0x4002_03FF"를 찾고, 해당 장의 레지스터 표에서 "ODR 오프셋 0x14"를 찾으면 GPIOA_ODR의 주소는 0x4002_0014입니다. CMSIS 헤더의 GPIOA->ODR은 이 계산을 대신해 주는 것입니다.

디버깅에 쓰기

하드폴트가 났을 때 문제 주소가 0x2000_xxxx면 RAM, 0x4xxx_xxxx면 주변장치 접근입니다. 클럭을 켜지 않은 주변장치의 레지스터에 접근하면 버스 오류가 나는데, 주소만 보고도 원인을 짐작할 수 있습니다.