STM32F1 存储器映射笔记版1. 先记住一句话STM32 把 Flash、SRAM、外设寄存器都统一编上地址CPU 访问它们就像访问内存一样。所以 STM32 里常说外设寄存器也是“内存地址”例如 GPIO、USART、TIM、RCC 这些外设本质上都有固定地址。一、STM32 的寻址范围STM32F1 使用 32 位地址总线。所以最大寻址空间是2^32 4GB地址范围0x0000 0000 ~ 0xFFFF FFFF也就是说STM32 把整个 4GB 空间划分成不同区域。二、STM32F1 常见存储器映射总表地址范围区域作用0x0000 0000 开始启动映射区上电后 CPU 首先访问的区域0x0800 0000 开始Flash存放程序代码0x2000 0000 开始SRAM存放运行时变量、栈、堆0x4000 0000 开始外设寄存器区GPIO、USART、TIM、RCC 等0x6000 0000 开始外部存储器区外接 SRAM、NOR Flash 等0xE000 0000 开始Cortex-M3 内核外设区NVIC、SysTick、SCB 等三、几个最重要的地址1. Flash 程序存储区Flash 起始地址0x0800 0000作用存放我们下载进去的程序比如你在 Keil 里点 Download程序一般就烧录到这里。STM32F103ZET6 常见 Flash 大小512KB所以大概范围是0x0800 0000 ~ 0x0807 FFFF重点记忆程序代码存在 FlashFlash 从 0x08000000 开始。2. SRAM 数据存储区SRAM 起始地址0x2000 0000作用存放变量、数组、栈、堆例如int a 10;int arr[100];这些程序运行时的数据一般就在 SRAM 里。STM32F103ZET6 常见 SRAM 大小64KB大概范围0x2000 0000 ~ 0x2000 FFFF重点记忆变量运行时主要在 SRAMSRAM 从 0x20000000 开始。3. 外设寄存器区外设寄存器区起始地址0x4000 0000GPIO、定时器、串口、RCC 等都在这里。例如外设常见基地址TIM20x4000 0000TIM30x4000 0400USART10x4001 3800GPIOA0x4001 0800GPIOB0x4001 0C00GPIOC0x4001 1000RCC0x4002 1000重点记忆外设寄存器从 0x40000000 开始。四、为什么说“外设寄存器也是地址”比如 GPIOA 的基地址是GPIOA_BASE 0x40010800GPIOA 里面有很多寄存器例如寄存器作用CRL配置低 8 个引脚CRH配置高 8 个引脚IDR输入数据寄存器ODR输出数据寄存器BSRR置位/复位寄存器这些寄存器本质上就是一些固定地址。例如GPIOA_BASE 0x40010800GPIOA_CRL GPIOA_BASE 0x00GPIOA_CRH GPIOA_BASE 0x04GPIOA_IDR GPIOA_BASE 0x08GPIOA_ODR GPIOA_BASE 0x0CGPIOA_BSRR GPIOA_BASE 0x10所以外设基地址 寄存器偏移地址 具体寄存器地址这就是后面要学的 寄存器映射。五、存储器映射和寄存器映射的关系存储器映射关注的是整个 STM32 地址空间怎么分配。例如Flash 在哪里SRAM 在哪里外设在哪里寄存器映射关注的是某一个外设内部每个寄存器具体在哪里。例如GPIOA 的 CRL 在哪里GPIOA 的 ODR 在哪里RCC 的 APB2ENR 在哪里简单理解存储器映射大地图寄存器映射某个外设内部的小地图六、启动地址映射STM32 上电复位后CPU 会从0x0000 0000开始取指令。但是我们程序实际存放在0x0800 0000所以 STM32 会根据 BOOT 引脚把不同区域映射到 0x00000000。常见启动方式BOOT 配置启动区域作用从 Flash 启动0x08000000 映射到 0x00000000正常运行用户程序从系统存储器启动System Memory串口下载程序等从 SRAM 启动0x20000000调试或特殊用途平时我们下载程序运行基本都是从 Flash 启动也就是0x00000000 实际对应 0x08000000七、程序入口和中断向量表STM32 程序最前面有一个东西叫中断向量表它通常放在 Flash 起始位置0x0800 0000上电后 CPU 会先读两个重要内容地址内容0x08000000栈顶地址 MSP0x08000004复位入口 Reset_Handler所以启动流程可以简单理解为上电↓读取 0x08000000设置栈顶↓读取 0x08000004找到复位函数↓进入 Reset_Handler↓进入 main 函数八、代码里为什么能直接操作外设比如库函数里经常看到RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);它背后本质是操作 RCC 的某个寄存器。RCC 的基地址0x40021000通过修改 RCC 里的时钟控制寄存器就能打开 GPIOA 的时钟。所以我们写GPIO_SetBits(GPIOA, GPIO_Pin_0);本质上也是修改 GPIOA 相关寄存器。底层逻辑是CPU 写某个地址↓这个地址对应 GPIOA 的寄存器↓GPIOA 引脚电平发生变化九、常见地址速记这个表很重要建议记住内容地址Flash 起始地址0x08000000SRAM 起始地址0x20000000外设起始地址0x40000000GPIOA 基地址0x40010800GPIOB 基地址0x40010C00RCC 基地址0x40021000USART1 基地址0x40013800TIM2 基地址0x40000000TIM3 基地址0x40000400Cortex-M3 内核外设0xE0000000十、学习时重点掌握什么这一节不用死背所有地址重点掌握这几个1. STM32 是 32 位寻址地址范围 4GB2. Flash 从 0x08000000 开始3. SRAM 从 0x20000000 开始4. 外设寄存器从 0x40000000 开始5. GPIO、USART、TIM、RCC 都是通过地址访问的6. 外设基地址 寄存器偏移 具体寄存器地址7. 启动时 0x00000000 会映射到不同启动区域十一、最简单理解可以把 STM32 想成一栋大楼0x08000000程序办公室放代码0x20000000临时仓库放变量0x40000000设备控制室控制 GPIO、串口、定时器0xE0000000内核管理室控制 NVIC、SysTickCPU 想干什么就去对应地址读写数据。例如想点亮 LED↓找到 GPIO 地址↓修改 GPIO 输出寄存器↓引脚输出高/低电平↓LED 亮/灭十二、一句话总结存储器映射就是STM32 把 Flash、SRAM、外设寄存器、内核外设等资源统一放到 4GB 地址空间中CPU 通过访问不同地址来读取数据、运行程序和控制外设。