存储器系统

存储器映射

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

最后更新于