|____1.1 CM3/CM4存储器映射 存储器映射1.Block0-----------------片内Flash代码区2.Block1-----------------片内SRAM区3.Block2-----------------片外外设区4.Block3/4/5------------片外RAM区5.Block6-----------------保留区6.Block7-----------------系统区存储器映射如图所示Block0主要用于程序代码包括作为程序存储器一部分的默认向量表该区域也允许数据访问Block1主要用于连接片上SRAM若支持可选的位段特性则1MB区域可位寻址还可在这个区域中执行程序代码Block2主要用于片上外设和Block1区域类似若支持可选的位段特性则1MB区域可位寻找Block3/4主要用于片外存储器等其他RAM且可存放程序代码和数据Block5主要用于片外外设等其他存储器Block6保留空间暂时未使用到Block7系统区域7.1 专用外设总线a.内部PPB【外设总线AHB】0xE000_0000~0xE003_FFFF主要用于访问NVIC、SysTick、MPU等系统部件及调试部件b.外部PPB【外设总线APB】0xE004_0000~0xE00F_FFFF主要用于访问TPIU、ETM、ROM表等调试部件7.2 供应商定义区域0xE010_0000~0xFFFF_FFFF多数情况下是用不上的1.Block0-----------------片内Flash代码区注意CM3和CM4的Block0空间划分存在差异具体划分是由厂家决定的。2.Block1-----------------片内SRAM区注意CM3和CM4在此区域的地址划分存在差异具体划分是由厂家决定的。1栈空间的开辟栈是从高往低生长所以结束地址就是栈顶地址。栈主要用于存放局部变量函数形参等属于编译器自动分配和释放的内存栈的大小不能超过内部 SRAM 的大小。如果工程的程序量比较大定义的局部变量比较多那么就需要在启动代码中修改栈的大小即修改 Stack_Size默认0x400 的值。如果程序出现了莫名其妙的错误并进入了 HardFault 的时候你就要考虑下是不是栈空间不够大溢出了的问题。2堆空间的开辟堆是由低向高生长默认大小设置为0x200在 STM32 里面用的比较少几乎不用。堆主要用于动态内存的分配像 malloc()、calloc()和 realloc()等函数申请的内存就在堆上面。堆中的内存一般由程序员分配和释放若程序员不释放程序结束时可能由操作系统回收。当使用GUI等需要处理大量数据的应用时需要使用大量的动态内存的时候一般使用内存管理来驱动外部 SRAM而不是内部SRAM。3.Block2-----------------片外外设区注意CM3和CM4在此区域的地址划分存在差异具体划分是由厂家决定的。对应的映射寄存器参考《参考手册》中的详细介绍。4.Block3/4/5------------片外RAM区注意CM3和CM4在此区域的地址划分存在差异具体划分是由厂家决定的。对应的映射寄存器参考《参考手册》中的详细介绍。对于 NAND Flash 存储器通用区和特性区存储空间分为三个部分均位于低位 256 KB 中数据区域通用/特性存储空间中的第一个 64 KB命令区域通用/特性存储空间中的第二个 64 KB地址区域通用/特性存储空间中的下一个 128 KB应用程序软件使用这 3 个区域来访问 NAND Flash 存储器向 NAND Flash 存储器发送命令软件可以向命令区域中的任意存储器位置写入命令值。指定读取或写入的 NAND Flash 地址软件可以向地址区域中的任意存储位置写入地址 值。由于地址的长度可以是 4 或 5 个字节具体取决于实际存储器大小要指定完整 的地址需要对地址区域执行多个连续写入操作。读取或写入数据软件将从数据区域中的任意存储器位置读取数据值或者向其中写入数据值。注意由于 NAND Flash 存储器会自动递增地址所以在访问连续存储器位置时无需递增数据区域的地址。5.Block6-----------------保留区注意CM3和CM4在此区域的地址划分存在差异具体划分是由厂家决定的。CM3/4在此区域都是保留用来预留扩展的。6.Block7-----------------系统区注意CM3和CM4在此区域的地址划分存在差异具体划分是由厂家决定的。对应的映射寄存器参考《参考手册》中的详细介绍。