建设部网站打不开,成都装饰公司网站建设,seo建站优化,重庆网站建设费用ARM Cortex-M 的系统映射空间
在 STM32 等 ARM Cortex-M 系列 MCU 中#xff0c;内存地址空间按照 存储功能 进行了严格划分#xff0c;包括 Flash#xff08;程序存储#xff09;、RAM#xff08;数据存储#xff09;、外设寄存器#xff08;GPIO、UART、SPI 等内存地址空间按照 存储功能 进行了严格划分包括 Flash程序存储、RAM数据存储、外设寄存器GPIO、UART、SPI 等以及系统控制寄存器中断、调试相关。下面详细解析各个地址段的作用和特点。
1.1 内存地址映射总览
在 ARM Cortex-M 处理器如 STM32 系列 MCU中地址空间通常采用 32 位地址总线因此可寻址 4GB0x00000000 ~ 0xFFFFFFFF但在嵌入式系统中MCU 的可用内存远小于 4GB并且地址空间被划分为多个功能区。
地址范围存储内容描述0x00000000 - 0x000003FF向量表Vector Table存放复位向量起始栈指针、异常入口地址0x08000000 - 0x0800FFFFFlash代码存储存储 程序代码.text 和 只读数据.rodata0x1FFFF000 - 0x1FFFF7FF系统 Boot ROM预留给 MCU BootLoaderISP、IAP 相关0x20000000 - 0x20004FFFRAM可变数据存储SRAMRAM存储 .data、.bss、堆、栈0x40000000 - 0x500607FF外设寄存器片上 GPIO、UART、SPI、I2C、TIM、ADC 等外设的控制寄存器0xE0000000 - 0xE00FFFFFSystem 控制寄存器NVIC中断控制、SysTick系统定时器、调试接口
1.20x00000000 - 0x000003FF向量表 (Vector Table)
MCU 复位后系统从 0x00000000 地址处读取向量表该表包含了复位后跳转到 main() 的入口地址。
作用
存储异常和中断向量表即异常/中断入口地址。第一项存放的是栈指针初值SP用于 CPU 复位时初始化堆栈。其余项是中断服务程序ISR地址例如 复位向量Reset Vector硬件故障处理HardFault、NMI外设中断UART、GPIO、TIM 等
向量表示例
0x00000000: 0x20004FFF ; 初始栈指针地址RAM 顶部
0x00000004: 0x08000239 ; 复位处理函数Reset_Handler
0x00000008: 0x08000321 ; NMI_Handler
0x0000000C: 0x08000345 ; HardFault_Handler该表通存储于 Flash0x08000000 1.3 0x08000000 - 0x0800FFFFFlash程序存储
作用
存放 MCU 固件程序代码包括 .text代码段.rodata只读数据 代码段的存储区域运行时 CPU 直接从 Flash 取指令不会加载到 RAM。
特点
Flash 只能按扇区擦除不能按字节修改通常 1 次擦除需要 20ms 左右。RAM 访问速度远快于 Flash因此 关键代码可拷贝到 RAM 执行。
1.4 0x1FFFF000 - 0x1FFFF7FF系统 Boot ROM
作用
STM32 MCU 内置 Bootloader引导程序支持 ISPIn-System Programming通过 UART/SWD 进行固件烧录。IAPIn-Application Programming运行时更新 Flash 代码。
特点
Bootloader 可以让 MCU 在 Flash 损坏的情况下仍然可以进行固件更新。通过 BOOT0 / BOOT1 硬件引脚可以选择启动 Flash 还是 Bootloader。
1.5 0x20000000 - 0x20004FFFRAM数据存储
作用
存储 MCU 运行时的变量和数据包括 .data 段已初始化的全局变量上电后从 Flash 复制到 RAM.bss 段未初始化的全局变量上电后初始化为 0堆Heapmalloc() 动态分配的内存栈Stack****局部变量、函数调用信息
结构
------------------ 0x20005000 RAM 结束
| Heap | 动态分配malloc
------------------
| Stack | 栈局部变量、返回地址
------------------
| .bss | 未初始化数据RAM
------------------
| .data | 已初始化全局变量RAM
------------------ 0x20000000 RAM 起始注意
栈向下增长堆向上增长如果二者相遇会导致崩溃Stack Overflow。优化方法 尽量使用 const 让数据存入 Flash减少 RAM 占用。避免使用 malloc()防止内存碎片化。
1.6 0x40000000 - 0x500607FF外设寄存器
作用
用于 MCU 片上外设的控制如 GPIO0x40010800控制 I/O 口输入/输出。UART0x40013800串口收发数据。SPI0x40013000SPI 传输数据。ADC0x40012400模拟信号转换。
代码示例
#define GPIOC_ODR (*((volatile uint32_t*) 0x4001100C))
GPIOC_ODR | (1 13); // 置位 PC13LED 亮特点
访问外设寄存器时 必须使用 volatile 修饰否则编译器可能优化导致错误。
1.7 0xE0000000 - 0xE00FFFFFSystem 控制寄存器
作用
控制 中断、调试、系统时钟主要包括 NVICNested Vectored Interrupt Controller中断控制器SysTick系统定时器SCBSystem Control Block系统控制块
代码示例
#define NVIC_ISER0 (*((volatile uint32_t*) 0xE000E100))
NVIC_ISER0 | (1 6); // 使能外部中断 6特点
NVIC 允许中断嵌套可以配置优先级。SysTick 是 Cortex-M 内置的 24-bit 计时器用于系统心跳计时