ARM MCU 内存划分

← 返回 Cortex-M4内核原理 | ← 主页|

更好的阅读体验

Cortex-M 地址空间

0xFFFF FFFF ┌──────────────────────────────────────────┐
            │ 片上系统外设 / 供应商保留区              │
0xE000 0000 ├──────────────────────────────────────────┤ ◄── 书上说的 0xE000 0000(PPB 内核私有总线)
            │ 0xE000 E010: SysTick 滴答定时器寄存器    │
            │ 0xE000 E100: NVIC 中断使能/优先级寄存器  │
            │ 0xE000 ED08: SCB->VTOR 向量表偏移寄存器  │
0x6000 0000 ├──────────────────────────────────────────┤
            │ 外部 RAM / 外部存储区                    │
0x4000 0000 ├──────────────────────────────────────────┤
            │ 片上外设区:GPIOA、USART1、TIM2、RCC...  │
0x2000 0000 ├──────────────────────────────────────────┤
            │ 片内 SRAM:变量、堆、栈                  │
0x080F FFFF ├──────────────────────────────────────────┤ ◄── Flash 代码区(0x0800 0000 ~ 0x080F FFFF,依芯片)
            │ [向量表] MSP、Reset、NMI、各中断入口...  │
            │ [代码区] main() 与用户业务代码           │
0x0800 0000 ├──────────────────────────────────────────┤ ◄── Flash 基址
            │ 空白区域                                 │
0x001F FFFF ├──────────────────────────────────────────┤
            │ 根据 boot0和boot1 映射:栈顶指针和       │
            │ reset handler 中断入口                   │
0x0000 0000 └──────────────────────────────────────────┘
 Plaintext
 ┌─────────────────────────────────────────────────────────┐
 │                    Flash / ROM (程序代码区)              │
 │  ┌───────────────────────────────────────────────────┐  │
 │  │ .text (代码段): 机器码.上电以后程序也运行在这里       │  │
 │  │                未初始化全局变量以指令方式存在,      |  |
 │  │	             上电后执行指令开辟 BSS 段            |  |
 │  │ .data 初始值: 全局变量的初始数值                    │  │
 │  └───────────────────────────────────────────────────┘  │
 └──────────────────────────┬──────────────────────────────┘
                            │ 1.硬件复位:
                            | 从flash的0x8000 0000读MSP值加载到MSP寄存器
                            | 从flash的0x8000 0004读取Reset_Handler地址,加载到PC寄存器
                            | 2.执行Reset_Handler:
                            | 执行SystemInit(),(在system_stm32xxxxx.c中,由ARM制定,ST写的)
                            | 3.执行__main():
                            | 复制flash的.data段到SRAM的.data区
                            | 清零SRAM的.bss区
                            | 完成其他的初始化最后调用用户的main()
 ┌──────────────────────────▼──────────────────────────────┐
 │        RAM (0x2000 0000~0x200x xxxx此根据芯片)            │
 │  ┌───────────────────────────────────────────────────┐  │
 │  │ .data (数据段): 已初始化的全局变量 / static变量      │  │
 │  ├───────────────────────────────────────────────────┤  │
 │  │ .bss (BSS段): 未初始化全局变量 (上电自动清零)        │  │
 │  │   变量地址编译期就已确定,后续赋值不改变其地址         |  |
 |  |    freertos的线程栈和TCB就在这里                   │  │
 │  ├───────────────────────────────────────────────────┤  │
 │  │ Heap (堆): malloc / free 动态申请的内存 (向上增长)  │  │
 │  ├───────────────────────────────────────────────────┤  │
 │  │ Stack (栈): 函数局部变量、返回地址、压栈保护 (向下)   │  │
 │  └─────────────────────────┬─────────────────────────┘  │
 └────────────────────────────┼────────────────────────────┘
                              │ CPU 抓取数据到寄存器计算
 ┌────────────────────────────▼────────────────────────────┐
 │                     CPU 芯片内部                         │
 │  ┌───────────────────────────────────────────────────┐  │
 │  │ Registers (CPU 寄存器: R0~R15, PC, SP 等):         │  │
 │  │ 速度最快、数量极少的"工作台",用来做真正的加减乘除     │  │
 │  └───────────────────────────────────────────────────┘  │
 └─────────────────────────────────────────────────────────┘