关联:存储器映射、位带区位带别名、systick

存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“ 私有外设区”。私有外设区的组件包括:

闪存地址重载及断点单元(FPB)

数据观察点单元(DWT)

指令跟踪宏单元(ITM)

 嵌入式跟踪宏单元(ETM)

 跟踪端口接口单元(TPIU)

 ROM 表 通常指的是 系统中断向量表系统控制表,它存储了和系统管理、异常处理以及一些核心功能相关的信息。

中断向量表(Interrupt Vector Table, IVT) 是一个存储中断处理函数地址的数据结构。它定义了每个中断源触发时,微控制器应该跳转到哪个特定的函数处理该中断。

每个中断源(例如外部中断、定时器中断、系统异常等)都会有一个对应的 中断服务程序(ISR),也就是中断处理函数

M3预存的存储器预设↓

并不是每个地址都有效。事实上,在这个地址空间中,许多地址并没有被使用,或者并不与物理存储或外设关联。这些地址通常是 未定义的地址,如果尝试访问这些地址,可能会导致 异常无效访问 错误。

映射的 SRAM 区的作用

        1. 存储局部变量和堆栈

2. 动态数据存储

3. 存储全局变量

4. 数据交换和计算缓存

5. 启动时的数据加载

6. 高频缓存区

7. 保存运行时状态

位带区和位带别名

位带区 (Bit-band area) 是一种特殊的内存区域,通常用于嵌入式系统中(如 STM32 微控制器),可以让我们通过一个 32 位内存单元 来操作内存中的 单个位,而无需使用位运算。

最后还剩下 0.5GB 的隐秘地带, CM3 内核的闺房就在这里面,包括了系统级组件,内部私有外设总线 s,外部私有外设总线 s,以及由提供者定义的系统外设。

私有外设总线有两条:

AHB 私有外设总线,只用于 CM3 内部的 AHB 外设,它们是: NVIC, FPB, DWT 和 ITM。

APB 私有外设总线,既用于 CM3 内部的 APB 设备,也用于外部设备(这里的“外部”是对内核而言)。 CM3 允许器件制造商再添加一些片上 APB 外设到 APB 私有总线上,它们通过 ABP 接口来访问。

  • 0xE000E000 – 0xE000EFFF:系统控制空间,用于控制处理器的核心功能和系统控制寄存器。主要涉及:

  • 系统控制块(SCB),负责处理器的复位、异常、系统配置等。
  • 中断控制器(NVIC),负责中断的管理。
  • 硬件调试接口
  • 0xE000E010 – 0xE000E01FSysTick 定时器控制寄存器,提供定时功能。

  • 0xE000E100 – 0xE000EFFF:这是 嵌套向量中断控制器(NVIC) 的寄存器区,管理中断的优先级、屏蔽等。

  • SYSTICK 只是一个定时器,它的作用是基于系统时钟(如 HSIHSE、或 PLL 时钟)提供定时中断或延时。它是用来执行时间间隔操作的,而不是作为整个系统的时钟源。整个系统的时钟周期通常由系统时钟源(如外部晶振、内部时钟源或 PLL)控制。

    RTC(Real-Time Clock) 是用于跟踪当前时间和日期的外设。RTC 通常独立于主处理器运行,并通过外部 晶振 提供稳定的时钟源。

    E0000000E00FFFFF 这个地址范围是专门为 系统控制外设中断管理 保留的区域。这个区域并不是一般的外设区域,而是一些特定的 系统管理和控制外设,它包括 NVIC(嵌套向量中断控制器)SysTick(系统定时器)系统控制硬件调试功能 等相关的外设。

    为什么“代码区”不可以缓存?

  • **代码区(0x0000_0000 – 0x1FFF_FFFF)**通常是程序代码存放的地方,也就是指令执行的内存区域。在该区域设置为“WT”意味着:
  • 在程序执行时,每次从该区域读取指令都直接从内存中读取,而不是从缓存中读取。这保证了程序执行时的数据一致性。
  • 私有外设区(Private Peripheral Region)指的是存储器地址空间中专门为系统的内部外设分配的区域。这个区域通常被 微控制器(MCU)微处理器(MPU)外设 所占用,用于与 系统核心外部设备 进行数据交换、控制和状态更新。

    私有外设区:是一个相对较为 狭义 的定义,通常指的是系统内部与核心功能或模块紧密耦合的外设,往往不直接与外部设备交互。它可能包括:

  • 系统控制外设:如 系统时钟复位控制中断控制器 等。
  • 调试接口看门狗时基模块 等。
  • 外设区:指的是所有通过 内存映射 I/O(MMIO)访问的外设,包括存储器、I/O接口、通信接口(如 UART、SPI、I2C)等。

    一.存储器的缺省访问许可

    CM3 有一个缺省的存储访问许可,它能防止使用户代码访问系统控制存储空间,保护NVIC、 MPU 等关键部件。缺省访问许可在下列条件时生效

    没有配备 MPU

    配备了 MPU,但是 MPU 被除能
     

    缺省的存储器访问许可权限如表

    1. 32 位数据的对齐要求

    对于 32 位数据(如 uint32_tfloat 等),访问时需要确保内存地址是 4 字节对齐,即地址是 4 的倍数。例如,访问 0x200000000x20000004 等地址时是合法的,但如果访问 0x20000001,则可能会导致总线错误(Bus Fault)。

    2. 16 位数据的对齐要求

    对于 16 位数据(如 uint16_t),通常要求 2 字节对齐。这意味着可以访问地址为 偶数地址(例如 0x200000000x20000002)的内存位置,但不能访问奇数地址(如 0x20000001)。

    3. 8 位数据的对齐要求

    对于 8 位数据(如 uint8_t),没有对齐要求,可以访问任何地址。这意味着可以访问 所有地址,包括 奇数地址

    4. 总线错误(Bus Fault)

    如果你访问了不满足对齐要求的地址(例如访问 0x20000001 来读取 32 位数据),ARM Cortex-M 处理器会产生一个 总线错误,因为处理器要求 32 位数据必须 4 字节对齐,而 16 位数据 必须 2 字节对齐

    存储器映射区域中的 1 字节对齐数据

    通常情况下,1 字节对齐 的区域是用于存储 8 位数据 的部分。具体来说,以下几个区域或数据类型是 1 字节对齐 的:

    1. 内部 SRAM 和外部存储器的字节数据
  • 内部 SRAM(例如 0x200000000x2001FFFF)和 外部存储器(如通过外部总线连接的存储器)中,8 位数据(如 uint8_t 类型)是 1 字节对齐 的。你可以将这些区域视为存储字节数据的地方,可以访问任何地址。
  • 2. 外设寄存器(8 位的外设)
  • 有些外设(特别是那些只涉及 8 位数据 的外设)在存储器映射中是 1 字节对齐 的。例如,一些只接收或传输字节数据的通信外设(如串口的数据寄存器)可能会存储为 1 字节对齐

  • 示例:一个 UART(串口)的 数据寄存器,它存储的是 8 位数据,在地址映射中会是 1 字节对齐

  • 位带操作还能用来化简跳转的判断。当跳转依据是某个位时,以前必须这样做:
     

    读取整个寄存器

    掩蔽不需要的位

    比较并跳转

    现在只需:

    从位带别名区读取状态位
    比较并跳转
     

    多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。以前的读-改-写需要 3 条指令,导致这中间留有两个能被中断的空当。于是可能会出现如下图所示的紊乱危象:
     

    通过使用 CM3 的位带操作,就可以消灭上例中的紊乱危象。 CM3 把这个“读-改-写”做成一个硬件级别支持的原子操作,不能被中断,
     

    作者:q2380957683

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 M4 存储器学习

    发表回复