存储器系统
存储器映射

M3 支持 4GB 存储空间,ARM 已经对做了粗线条划分。且对 SRAM 和外设的前 1MB 地址提供了位带操作功能。
从 0xE000 0000 开始是 M3 内核私有区域,所有的芯片厂家都一样。
在此基础上,STM32 也定义了自己的存储器映射。
通过把外设的寄存器映射到外设区,可以使用访问内存的方式来访问寄存器。
CM3 内部有个总线设施来优化这种存储器结构。此外也允许这些区域“越权使用”,比如说数据存储器也可以放在代码区,代码也可以在外部RAM区运行,只是速度会慢一些。
最大地址为系统外设,包括NVIC、MPU、以及调试组件。
MCU 中的存储器
具体的芯片厂商也会设计更多的存储器系统功能。如
Bootloader
存储器重映射
存储器别名
如 STM32 的存储器的地址重映射可以通过配置 boot 引脚实现。
芯片复位后总是从 0x0000 0000 取得 MSP 的值,然后从 0x0000 0004 取得 PC 的值。
但是可以启动的存储器的物理地址有多个
片上 SRAM 起始地址
0x2000 0000,常用于调试用片上 flash 起始地址
0x0800 0000,实际的存放代码的地址片上系统flash(bootloader) 起始地址
0x1fff 0000,提供flash编程功能
为了实现不同需求,地址译码器需要设计成可编程的,通过 boot 引脚的配置实现从不同位置启动。
除了 boot 引脚配置,STM32 还可以使用重映射寄存器配置。
位带操作(位段操作)
M3 在片上 RAM 和片上外设都有 1MB 的位带区域(位段区域),以及 32 MB 的位带别名区(位段别名)。
SRAM
位段区
0x2000 0000 - 0x2010 0000别名区0x2200 0000 - 0x2400 0000
外设
位段区
0x4000 0000 - 0x4010 0000别名区0x4200 0000 - 0x4400 0000
在位段区域的每个字由位段区域的 32 个字的 LSB 来表示。
对位段别名区字的操作最终变换为对位段比特位的操作
访问位段别名区必须字对齐
对位带别名区的操作是硬件级别的原子操作,无法被中断打断(原来是读-写-改)
C 中使用位带功能是,要访问的变量要用 volatile 定义,C 编译器不知道同一个数据会以两个地址访问,确保每个访问操作的是存储器位置而非处理器内的备份。
地址映射关系
bit_band_addr = bit_band_base + byte_offset*32 + bit*4
最后更新于