友烁吹抗在这里会较为详细的阐述各种类型的存储器的特点及其之间的差别以及我们会在STM32单片机上面使用一种超级便捷的方式来管理我们所使用到的内存。理清 xxRAM、xxROM、xxFlash 的核心作用三种不同存储器RAM、ROM、Flash这三个总的概括就使用一个表格来说明吧表格如下内存 存储类型 核心功能 数据保持 单片机对应硬件 典型存储内容RAM 易失性 存放动态数据、临时变量 掉电丢失 DTCM/AXI SRAM / 普通 SRAM 全局变量、局部变量、栈 / 堆ROM概念 非易失性 只读存储功能 掉电不丢 由 Flash 实现 无独立硬件功能同 FlashFlash 非易失性 存放程序代码、常量 掉电不丢 片上 Flash一般0x08000000 起 代码段、const 常量、复位向量表四种 RAMDRAM、SRAM、SDRAM、MRAMDRAM(Dynamic RAM动态随机存取存储器)原理 利用电容存储电荷来表示数据0/1但电容会漏电需要定期 “刷新”每隔几毫秒充电一次才能保持数据。特点 结构简单一个晶体管 一个电容密度高相同体积下容量更大速度中等比 SRAM 慢功耗较高刷新需要耗电价格便宜单位容量成本低。应用 PC 的内存DDR4/DDR5 都是 DRAM 的改进型、智能手机的运行内存RAM等需要大容量临时存储的场景。SRAM(Static RAM静态随机存取存储器)原理 利用触发器由多个晶体管组成存储数据无需刷新只要供电就能保持数据。特点 速度极快访问时间纳秒级比 DRAM 快 10~100 倍结构复杂一个 bit 需要 6~8 个晶体管密度低容量小价格高单位容量成本是 DRAM 的几倍功耗中等无需刷新但晶体管本身耗电。应用 CPU 内部的高速缓存L1/L2/L3 Cache、STM32 片上 RAM如 DTCM、SRAM1~4 都是 SRAM等需要高速访问的场景。SDRAM(Synchronous DRAM同步动态随机存取存储器)原理 属于 DRAM 的一种工作时与 CPU 时钟同步数据读写按时钟节拍进行需要定期刷新。特点 速度比传统异步 DRAM 快容量大常见 128MB~2GB需外部控制器如 STM32 的 FMC 接口时序配置复杂。应用 嵌入式系统扩展大容量临时存储如 STM32 H7 系列外接 SDRAM 用于存放视频帧、大型缓存数据等。MRAM(Magnetoresistive RAM磁阻式随机存取存储器)原理 利用磁阻效应存储数据通过磁场变化改变电阻状态表示 0/1非易失性无需刷新。特点 速度接近 SRAM容量接近 DRAM非易失性掉电不丢数据功耗低无需刷新和电荷维持寿命长理论无限次擦写成本高目前还未大规模普及。应用 高端嵌入式系统如工业控制、汽车电子需要 “高速 非易失” 的场景替代部分 SRAM 和 Flash 的组合使用对比特性 DRAM SRAM SDRAM MRAM易失性 掉电丢失 掉电丢失 掉电丢失 掉电不丢失速度 中等(几十纳秒) 极快(几纳秒接近 CPU 速度) 比 DRAM 快(同步时钟优化) 接近 SRAM(几纳秒)大小 GB 级 MB 级 数百 MB~ 数 GB 目前可达 GB 级逐步提升功耗 较高 中等 略低于 DRAM 低成本 低 高 与 DRAM 接近 高(未大规模普及)应用 早期 PC 内存、低端嵌入式设备 CPU 缓存、STM32 片内 RAM 嵌入式扩展内存 工业控制、汽车电子两种 FlashNAND Flash、NOR FlashNOR Flash(或非闪存)原理 同样基于浮栅晶体管非易失性但内部结构与 NAND 不同。特点 随机访问速度快可直接 “按地址读取”类似 RAM支持 “代码在 Flash 中直接运行”XIPeXecute In Place密度低容量小价格高单位容量成本高擦写速度慢尤其大容量擦除。应用 嵌入式系统的 “程序存储器”如 STM32 片上 Flash 几乎都是 NOR Flash用于存储程序代码、启动程序路由器、交换机的固件存储等STM32 中片内 Flash如 0x08000000 起始地址的存储区域均为 NOR Flash支持程序直接在 Flash 中运行无需加载到 RAM。NAND Flash(与非闪存)原理 基于浮栅晶体管存储电荷通过电荷是否存在表示数据属于非易失性存储掉电不丢数据。特点 结构简单密度极高相同体积下容量远大于 NOR Flash读写速度 “页级快、随机慢”适合连续读写随机访问速度差价格低单位容量成本是 NOR Flash 的 1/5~1/10但有 “坏块” 和 “擦写次数限制”通常 10 万次以上。应用 大容量存储场景如 U 盘、SD 卡、固态硬盘SSD、嵌入式系统的 “硬盘”如存储固件、日志、用户数据STM32 中部分型号支持外接 NAND Flash如 F4/F7/H7 系列用于扩展大容量非易失性存储。对比特性 NOR Flash NAND Flash存储结构 并行结构地址线可直接寻址单个字节 串行 / 页式结构需按 “块 - 页” 层级寻址速度 随机访问快(10~100ns)支持按地址读单个字节连续读写速度慢 随机访问慢(需先找块、再找页)连续读写快页级操作几十 MB/s执行能力 支持 XIP(就地执行)程序可直接在 Flash 中运行无需加载到 RAM 不支持 XIP代码需先加载到 RAM 才能运行擦写特性 支持小粒度擦除(扇区级如 4KB/8KB)部分支持字节级修改 必须 “先擦除再写入”擦除粒度大(块级如 128KB/256KB)仅支持页级写入容量与密度 密度低单芯片容量小(通常 1MB~1GB) 密度高单芯片容量大(通常 8GB~1TB甚至更高)成本 单位容量成本高(约为 NAND 的 5~10 倍) 单位容量成本低性价比高引脚与接口 引脚多(需地址线、数据线分离)接口复杂 引脚少(地址 / 数据复用)接口简单(如 SPI/NAND、ONFI 接口)应用 小型嵌入式设备的程序存储、交换机 硬盘、手机、平板的内置存储EEPROM原理 通过电信号擦除和写入数据非易失性可字节级擦写无需按块擦除。特点 擦写方便支持单个字节修改无需整块擦除容量小通常 KB 级最大几 MB速度慢擦写时间毫秒级寿命有限通常 10 万次擦写。应用 存储少量需要频繁修改的非易失性数据如设备参数波特率、地址、校准数据传感器零点、用户配置等STM32 中部分型号内置 EEPROM如 F1/F4 系列或通过 “Flash 模拟 EEPROM” 功能实现类似效果如 H7 系列无独立 EEPROM需用 Flash 特定区域模拟。H7 系列内存详解参考文章[ST] STM32H7的TCM,SRAM等五块内存基础知识H7的内部内存分为了ITCMDTCMAXI SRAMSRAM1SRAM2SRAM3SRAM4和备份SRAM。下图中分为了三个域D1 DomainD2 Domain和D3 Domain。TCM 区(Tightly-Coupled Memory 紧密耦合内存)ITCM用于运行指令也就是程序代码。DTCM用于数据存取特点是跟内核速度一样而片上RAM的速度基本都达不到这个速度所以有降频处理。AXI SRAM 区位于D1域数据带宽是64bit挂在A线上。除了D3域中的BDMB主控不能访问其它都可以访问此RAM区。AXI SRAM地址0x2400 0000。速度200MHz。大小512KB。用途用途不限可以用于用户应用数据存储或者LCD显存。SRAM1SRAM2和SRAM3 区位于D2域数据带宽是32bit挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM其它都可以访问这几个RAM区。SRAM1地址0x3000 0000。速度200MHz。大小128KB。用途用途不限可用于D2域中的DMA缓冲也可以当D1域断电后用于运行程序代码。SRAM2地址0x3002 0000。速度200MHz。大小128KB。用途用途不限可用于D2域中的DMA缓冲也可以用于用户数据存取。SRAM3地址0x3004 0000。速度200MHz。大小32KB。用途用途不限主要用于以太网和USB的缓冲。SRAM4 区位于D3域数据带宽是32bit挂在AHB总线上大部分主控都能访这块SRAM区。地址0x3800 0000。速度200MHz。大小64KB。用途用途不限可以用于D3域中的DMA缓冲也可以当D1和D2域进入DStandby待机方式后继续保存用户数据。Backup SRAM 区备份RAM区位于D3域数据带宽是32bit挂在AHB总线上大部分主控都能访问这块SRAM区。SRAM4地址0x3880 0000。速度200MHz。大小4KB。用途用途不限主要用于系统进入低功耗模式后继续保存数据Vbat引脚外接电池。内存时钟问题AXI SRAMSRAM4ITCM和DTCM可以在上电后直接使用。而SRAM1SRAM2SRAM3是需要使能的但是实际测试发现不使能也可以正常使用。不过建议用到时候开启下时钟防止意想不到的问题发生。RAM 的 DMA 问题Bus Master总线主控端和Bus Slave设备端的控制互联加粗字体是64位总线ITCMDTCMFlash AFlashAXI SRAMFMC等普通字体是32位总线。访问通路每个小方块里面的字符任何有数字的表示有访问通路。短横杠“-”表示不可访问。有灰色阴影的表示有实用价值的访问通路。表格中具体数值所代表的含义Ddirect,1via AXI bus matrix,2via AHB bus matrix in D2,3via AHB bus matrix in D3,4via AHB/APB bridge in D1,5via AHB/APB bridge in D2,6via AHB/APB bridge in D3,7via AHBS bus of Cortex-M7,多个数值组合 互连路径以数字的顺序经过多个矩阵或/和桥。总线访问类型普通字体表示32位总线。斜体表示32位总线主机端/ 64位总线从机端。粗体表示64位总线。超便捷的内存区域管理方法参考文章【STM32H7教程】第26章 STM32H7的TCMSRAM等五块内存的超方便使用方式一般的内存管理方式不太注意的话一般都是在target dialog这里简单管理内存。这种情况下所有管理工作都是编译来处理的。分散加载式管理内存区域使用分散加载的方式来管理内存会超级灵活想用哪一块就用哪一块。下面就是超级教程在魔术棒的OutPut配置中会生成一个相同名字的 .sct 文件这个就是这个方法的关键找到它。第一步取消勾选Use Memiry Layout from Target Dialog。点击...找到与输出文件同名的 .sct 文件假如你这里没有显示的话。点击Edit打开这个 .sct 文件。第二步使用 STM32H7 系列的可以直接将以下程序复制进去。其他系列的单片机则需要稍加修改。假如不同你需要修改的有内存(ROM 或者 RAM)首地址内存大小点击查看代码注意STM32H743系列的单片机的RAM都是992KB的故AXI SRAM区域最终计算出来只有288KB并非512KB。可以看出RW区也是要存储到ROM/Flash里面的在执行映像之前必须将已初始化的 RW 数据从 ROM 中复制到 RAM 中的执行地址并创建ZI Section初始化为0的变量区。上面的程序注释中已经详细说明了这一段程序的作用其中的加载区域就是程序在Flash中的实际存储而运行区域是芯片上电后的运行状态通过下面的框图可以有一个感性的认识博客导航