ST/개발 환경 및 구조

STM32F103x Memory map

engineer4ever 2025. 3. 18. 00:05

 

- STM32F103의 메모리 맵은 Cortex-M3 코어를 기반으로 설계된 마이크로컨트롤러의 주소 공간 구조

- 메모리 맵은 다양한 메모리와 주변 장치의 주소를 정의하며, 다음의 사진과 같음

DS5319 : STM32F103x8 datasheet p.34

 

1. 코드 메모리 영역 (0x0000 0000 ~ 0x1FFF FFFF)

- 부트 메모리: 0x0000 0000 ~ 0x1FFF FFFF

- 초기 부트 로더 코드가 위치. 부팅 모드에 따라 플래시 메모리, SRAM, 또는 시스템 메모리로 매핑

 

2. SRAM (0x2000 0000 ~ 0x3FFF FFFF)

- 내부 SRAM: 0x2000 0000 ~ 0x2000 4FFF (20KB)

- 일반 데이터 저장용. Cortex-M3 코어에서 빠르게 액세스 가능

- 추가로 사용 가능한 SRAM 주소는 비워진 공간에 의해 확장될 수 있음

 

3. 주변 장치 (0x4000 0000 ~ 0x5FFF FFFF)

- APB1/APB2 버스와 AHB 버스 주변 장치에 매핑된 주소

- APB1: 0x4000 0000 ~ 0x4000 FFFF

- APB2: 0x4001 0000 ~ 0x4001 FFFF

- AHB: 0x5000 0000 ~ 0x5006 FFFF

- 타이머, ADC, USART, SPI와 같은 장치의 레지스터가 포함

 

4. 플래시 메모리 (0x0800 0000 ~ 0x080F FFFF)

- 64KB ~ 128KB 플래시 메모리 (모델에 따라 다름)

- 사용자 프로그램과 데이터 저장용

 

5. 시스템 메모리 (0x1FFF F000 ~ 0x1FFF FFFF)

- 제조사 제공 부트로더가 위치

- UART, USB DFU 등으로 펌웨어 업로드 가능

 

6. 외부 메모리 (0x6000 0000 ~ 0x9FFF FFFF)

- FSMC(Flexible Static Memory Controller)를 통해 외부 SRAM, NOR, NAND 플래시 메모리 등을 연결

 

7. 코어 영역 (0xE000 0000 ~ 0xE00F FFFF)

- System Control Space (SCS): 0xE000 E000 ~ 0xE000 EFFF

- NVIC, SysTick, 디버그 관련 레지스터

- Cortex-M3 프로세서 특화 레지스터 포함


그러면 도대체 이걸 왜 알아야 할까?

 

1. 펌웨어 개발

특정 메모리 영역 접근: 예를 들어, 플래시 메모리, SRAM, 또는 주변 장치 레지스터에 접근할 때

Interrupt Vector Table 설정: 인터럽트 핸들러를 설정하려면 메모리 맵을 알아야 함

 

2. 디버깅 및 문제 해결

디버깅 중에 메모리 주소를 참조하여 오류를 찾거나 메모리 상태를 분석할 때

예를 들어, 스택 오버플로우나 메모리 충돌 문제를 추적할 때 도움이 됨

 

3. 부트로더 개발

부트로더는 플래시 메모리의 특정 영역에서 실행되므로 정확한 메모리 맵 정보를 기반으로 코드를 작성

 

4. 주변 장치 제어

UART, SPI, GPIO 등과 같은 주변 장치를 설정하려면 해당 레지스터 주소를 정확히 알아야 하며, 이는 메모리 맵에 정의

 

5. Direct Memory Access (DMA) 설정

DMA를 사용할 때 소스와 목적지 주소를 설정해야 하므로 메모리 맵을 참고

 

6. 커스텀 메모리 섹션 설정

특정 코드나 데이터를 특정 메모리 섹션에 배치해야 할 때, 메모리 맵 정보를 활용하여 링크 스크립트를 작성

 

'ST > 개발 환경 및 구조' 카테고리의 다른 글

STM32F103x Core registers  (0) 2025.03.18
ST MCU/MPU Security Features  (0) 2025.03.18
CMSIS  (0) 2025.03.18
STM32 CubeMX LL driver  (0) 2025.03.18
STM32 Driver(Library)  (0) 2025.03.18