# 67_MCU的几大分区

好的,我来按照CSDN Markdown规范扩写这篇关于高性能MCU存储分区的技术文章。


高性能MCU存储分区详解:从Flash到Cache的完整剖析

高性能MCU存储分区详解:从Flash到Cache的完整剖析

前言

在嵌入式开发中,8位MCU(如STM8、51系列)的存储结构相对简单------一块Flash放代码,一小块RAM放变量,基本就完事了。然而,当我们把视角拉高,看向高性能MCU(如STM32F4/H7、NXP i.MX RT、TI TMS320等),存储系统立刻变得复杂起来。本文将以STM32F407为例,深入剖析高性能MCU的存储分区体系。

为什么需要关注存储分区?因为性能优化、系统稳定性、功能安全都依赖于对存储系统的深刻理解。把关键代码放在哪里、DMA缓冲区如何分配、Cache如何配置,每一个决策都直接影响系统表现。


一、整体架构概览

高性能MCU的存储系统远比8位机复杂,它不再是简单的"程序存Flash、数据存RAM",而是一个包含多种存储介质、多层缓存、可编程权限控制的层次化系统。

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                        芯片内部                                  │
├─────────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │
│  │   Flash     │  │   RAM       │  │  Cache      │              │
│  │  (代码+常量) │  │  (变量+堆栈) │  │ (加速)      │              │
│  └─────────────┘  └─────────────┘  └─────────────┘              │
├─────────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │
│  │   Boot ROM  │  │  System     │  │   TCM       │              │
│  │ (启动固件)  │  │  Memory     │  │ (紧耦合内存) │              │
│  └─────────────┘  └─────────────┘  └─────────────┘              │
└─────────────────────────────────────────────────────────────────┘

从上图可以看出,高性能MCU的存储系统至少包含Flash、RAM、Cache、Boot ROM、System Memory、TCM六大模块。每个模块内部又进一步细分,构成了一个精密的存储层次体系。下面我们逐一拆解。


二、Flash(程序存储器)分区

Flash不再是铁板一块。在高性能MCU中,Flash被划分为多个功能明确的区域,每个区域都有自己的使命。

分区 用途 示例地址(STM32F407)
Bootloader区 启动引导、固件升级 0x08000000 ~ 0x08004000
主程序区 应用程序代码 0x08004000 ~ 0x0807FFFF
中断向量表 中断入口地址 存放于Flash起始位置
配置字/选项字节 读保护、看门狗、BOR等 独立区域
EEPROM模拟区 用Flash模拟掉电保存数据 最后2个扇区
备份寄存器区 VBAT供电的小容量存储 4KB

2.1 Bootloader区

Bootloader是芯片上电后执行的第一段代码。以STM32为例,系统Bootloader固化在System Memory中(不可擦除),而用户也可以在自己的Flash起始位置放置自定义Bootloader。这部分代码负责:

  • 判断启动模式(从Flash启动、从System Memory启动、从SRAM启动)
  • 固件完整性校验(CRC检查)
  • 在线升级(IAP/OTA)
  • 跳转到应用程序

2.2 中断向量表

中断向量表存放的是各个中断服务函数(ISR)的入口地址。在STM32F4中,向量表默认位于Flash起始地址 0x08000000,但可以通过SCB->VTOR寄存器重映射到RAM中,这对于动态更新中断服务函数非常有用。

2.3 选项字节(Option Bytes)

选项字节是Flash中的特殊区域,用于存储芯片配置信息:

配置项 功能
RDP(读保护) 防止固件被非法读取
WWDG/IWDG 硬件看门狗使能控制
BOR(欠压复位) 设置欠压复位阈值
NRST 复位引脚功能配置

三、RAM(数据存储器)分区------最复杂的部分

如果说Flash分区还算直观,那么高性能MCU的RAM分区绝对刷新认知。RAM不是一整块,而是根据性能、功能、供电方式分成了多种类型。这是高性能MCU与8位机最本质的区别之一。

3.1 RAM类型总览

RAM类型 特点 典型容量 用途
DTCM(数据紧耦合内存) CPU直连,零等待,最快 64KB 实时数据、频繁访问的变量
ITCM(指令紧耦合内存) CPU直连,零等待,最快 64KB 关键代码、ISR
SRAM1 通用,可DMA访问 112KB 普通数据
SRAM2 通用,可DMA访问 16KB 普通数据
SRAM3 通用(部分型号) 64KB 普通数据
CCM(内核耦合内存) 仅CPU访问,DMA不能访问 64KB 堆栈、关键变量
备份SRAM VBAT供电,掉电保留 4KB 休眠时保存数据
外设SRAM 某些外设专用(Ethernet、USB) --- DMA缓冲区

3.2 实际存储映射

以STM32F407ZG为例,不同RAM块在地址空间中的分布如下:

复制代码
0x10000000 - 0x1000FFFF  →  CCM RAM (64KB,仅CPU可访问)
0x20000000 - 0x2001BFFF  →  SRAM1 (112KB)
0x2001C000 - 0x2001FFFF  →  SRAM2 (16KB)
0x20020000 - 0x2002FFFF  →  SRAM3 (64KB,仅F42x/F43x系列)
0x40024000 - 0x40024FFF  →  备份SRAM (4KB)

3.3 TCM与CCM的区别

这是一个经常被混淆的概念,有必要单独说明:

对比维度 TCM(紧耦合内存) CCM(内核耦合内存)
访问路径 通过AHB总线,绕过Cache 直接挂在内核数据总线
DMA访问 不支持 不支持
典型用途 确定性实时数据 堆栈、RTOS任务栈
延迟 零等待 零等待
所属架构 ARM Cortex-M7及以上 ARM Cortex-M4(STM32专有)

关键记住一点:CCM是STM32F4系列特有的,而TCM是ARM Cortex-M7架构的标准配置。它们的共同点是都不能被DMA访问,因此不要把DMA缓冲区放到这些区域。

3.4 备份SRAM

备份SRAM是一个特殊的存在。它由VBAT引脚独立供电,即使主电源断开,只要VBAT有电(通常接纽扣电池),数据就不会丢失。典型应用场景:

  • 设备异常断电前的状态快照
  • 低功耗休眠模式下的数据保持
  • 实时时钟(RTC)的配套存储

四、Cache(缓存)体系

当CPU主频超过100MHz后,Flash的访问延迟就成为性能瓶颈。以STM32F407为例,CPU跑168MHz,而Flash访问需要等待周期。Cache的出现就是为了弥合这个速度差距。

4.1 Cache类型

类型 功能 典型大小
I-Cache(指令缓存) 缓存Flash中的指令,减少取指延迟 16KB
D-Cache(数据缓存) 缓存Flash/RAM中的常量数据 16KB

4.2 Cache的一致性陷阱

使用Cache时必须注意数据一致性问题。当DMA从外设搬运数据到SRAM时,如果CPU之前缓存了同一地址的旧数据,就会读到过期内容。解决方法:

c 复制代码
/** 
 * 功能:DMA接收完成后的Cache清理
 * 参数:buf - 缓冲区地址, len - 缓冲区长度
 * 返回值:无
 **/
/**
 * Function: Clean cache after DMA reception completes
 * Parameters: buf - buffer address, len - buffer length
 * Return value: None
 **/
void CleanCacheAfterDMA(void* buf, uint32_t len)
{
    /* CN: 使D-Cache中对应区域失效,强制下次读取从SRAM获取 -- EN: Invalidate the corresponding D-Cache region to force next read from SRAM */
    SCB_InvalidateDCache_by_Addr(buf, len);
}

4.3 TCM的确定性优势

Cache虽然能加速平均访问速度,但命中和未命中 的延迟是不确定的。对于实时控制系统(如电机控制、数字电源),这种不确定性是不可接受的。TCM正是为此而生------它绕过Cache,始终以零等待周期访问,保证确定性实时行为


五、MPU(内存保护单元)分区

MPU是高性能MCU的一项重要安全特性。它允许开发者软件定义存储区域的访问权限,实现细粒度的内存保护。

5.1 典型MPU配置

区域 权限设置 用途
Region 0 只读,特权模式 代码区保护,防止意外篡改
Region 1 读写,用户模式 正常数据区
Region 2 不可执行 防止缓冲区溢出攻击(XN)
Region 3 设备内存类型 外设寄存器,禁止Cache

5.2 为什么需要MPU?

在RTOS环境中,多个任务共享同一块物理内存。如果没有MPU保护:

  • 任务A的野指针可能破坏任务B的数据
  • 栈溢出可能悄无声息地覆盖关键变量
  • 缓冲区溢出攻击可以执行注入的恶意代码

MPU通过硬件检测,在违规访问发生的瞬间触发MemManage异常,将问题扼杀在摇篮里。


六、外部存储扩展

高性能MCU通常还支持通过外部总线扩展存储。以STM32F4的FSMC/FMC控制器为例:

可扩展存储类型 典型容量 用途
SRAM 256KB ~ 2MB 高速数据缓冲
SDRAM 8MB ~ 64MB 大容量数据存储、显示帧缓冲
NOR Flash 4MB ~ 64MB 代码存储、资源文件
NAND Flash 128MB ~ 4GB 海量数据记录

SDRAM虽然容量大,但需要定期刷新,且访问延迟不稳定。通常用作帧缓冲区或日志存储,而不适合存放实时性要求高的数据。


七、低功耗场景下的存储策略

高性能MCU通常支持多种低功耗模式,不同模式下存储器的供电策略也不同:

低功耗模式 SRAM保持 备份SRAM保持 唤醒时间
Sleep 微秒级
Stop 毫秒级
Standby 是(VBAT) 相当于复位

设计低功耗产品时,需要在进入Standby模式前,将关键数据保存到备份SRAM中,唤醒后从中恢复。


八、对比总结

最后,我们用一个总表来对比8位MCU与高性能MCU的存储系统差异:

分区类型 JSC8P012(8位机) STM32F4(高性能MCU)
Flash 2KB,不分区 1MB,可分多个扇区
RAM 112B,3个Bank 192KB+,6种以上类型
Cache I-Cache + D-Cache(16KB+16KB)
TCM/CCM 64KB零等待
备份RAM 4KB VBAT供电
Boot ROM 内置Bootloader
MPU 8~16个可编程区域
外部存储控制器 FSMC/FMC

九、总结

高性能MCU的存储分区是一个立体化的多层次系统。它不仅包含物理分区 (Flash扇区、SRAM块),还涉及性能分区 (TCM vs 普通SRAM vs Cache)、权限分区 (MPU)和生命周期分区(备份域、Option Bytes)。

在8位机上,"分区"就是一个简单的地址划分;到了高性能MCU,分区可以是物理的、逻辑的、权限的、性能分级的------这是一个巨大的思维跃迁。

如果你正从8位平台迁移到ARM Cortex-M系列,建议先从存储映射图入手,理解每个地址段对应的物理特性和访问限制。这是写好高性能嵌入式软件的基石。


参考资料

1\] STM32F407 Reference Manual (RM0090), STMicroelectronics \[2\] ARM Cortex-M4 Devices Generic User Guide \[3\] [ARM Cortex-M7 Technical Reference Manual](https://developer.arm.com/documentation/ddi0489/latest/) \[4\] [Mermaid语法说明](https://mermaid.js.org/intro/)

相关推荐
Tech_D2 小时前
用在3D测量的五轴直线电机模组
人工智能·3d·机器人·自动化·制造
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 230. 二叉搜索树中第 K 小的元素 | C++ 栈迭代中序遍历
c++·算法·leetcode
大熊背2 小时前
ISP Pipeline中Lv实现方式探究之六--lv值计算再优化
网络·算法·自动曝光·lv
RTC老炮2 小时前
WebRTC下FlexFEC算法架构及原理
网络·算法·音视频·webrtc
xin_nai2 小时前
LeetCode热题100(Java)(2)双指针
算法·leetcode·职场和发展
SDAU20052 小时前
CH552的时钟应用
stm32·单片机·嵌入式硬件
实在太懒于是不想取名2 小时前
STM32N6的开发日记(6):用ISP中间件点亮IMX335相机的专业画质
stm32·嵌入式硬件·接口隔离原则
七颗糖很甜2 小时前
预警!超级厄尔尼诺即将登场:2026-2027年全球气候或迎“极端狂暴模式”
java·大数据·python·算法·github
天狼IoT2 小时前
STM32开发速查笔记
stm32·单片机·嵌入式硬件