Cortex m3内核规定的存储器映射如下图所示。就好像ARM公司打造了一个柜子,从上到下有这几个抽屉,它规定了每个抽屉放的东西的种类,具体放什么放多少它不管(只要不超过抽屉的大小),由每个芯片厂商自己决定。
图1 cortex m3存储器映射 $ Q; P3 }: k6 J2 I 我们来看看ST公司打造的STM32F1系列芯片是如何在这些抽屉放置东西的。9 Z8 w( [9 |4 V) b3 l4 n 代码抽屉$ v; M! T* r8 v 在代码这个抽屉,STM32F1布置了Flash模块,用来存储代码,相当于电脑的硬盘,具体展开如下图所示。主存储器(图中Flash区)起始起止为0x0800 0000,终止地址依Flash大小而定,图中0x0807 FFFF为512k的终止地址。然后经过一段保留区,从0x1FFFF000 – 0x1FFF F7FF为系统存储器,是不可擦除的ROM区,存储ISP程序,最后option bytes这个区域是16个字节,是控制flash区域的寄存器。有同学说我漏了一块,对,从0x0000 0000的这块是我要着重讲解的一块。8 q. X1 F9 K' C$ @9 G/ A8 A " v; \8 i" K! w' u) h8 @
图2 STM32F1代码区抽屉 - g: b2 S3 w( U$ j t 在讲这块之前,首先要讲一下STM32F1的三种启动模式,如下图所示。( u. r' N7 t, f, a/ t: |3 f 1).主闪存存储器启动:从STM32内置的Flash启动(0x0800 0000-0x0807 FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。$ W5 d! }8 {/ p7 e: `& O: C$ i ! k4 {/ M7 ~- q5 ?& j. c- d 2).系统存储器启动:从系统存储器启动(0x1FFFF000 – 0x1FFF F7FF),这种模式启动的程序功能是由厂家设置的。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。 + Y7 e* T9 |7 H/ U 3).片上SRAM启动:从内置SRAM启动(0x2000 0000-0x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。 下面讲解Boot MemorySpace(Aliased to Flash or systen memory depending onBOOT pins)。其实这块空间是预留的,不存数据,或者它压根不存在。在不同的启动方式下,这块区域会被映射到其他区域: 1).从Main Flash 启动:Boot Space 是Main Flash 的别名。以0x08000000 对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x08000000 操作,且都是操作的同一块内存 2).从System Memory启动:Boot Space 是System Memory的别名。以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存 3).从SRAM 启动:SRAM 只能通过0x20000000进行操作,与上述两者不同。从SRAM 启动时,需要在应用程序初始化代码中重新设置向量表的位置。
图3 STM32F1三种启动模式* W+ ~# e& ~4 b, W4 L4 ?# f- G) P ! b& {4 p" B4 m. B g* c* Y- l 片上SRAM抽屉 在SRAM这个抽屉,STM32F1布置了SRAM,相当于电脑的内存,具体展开如下图所示。 ( Z7 A8 h* b: x! `9 F
图4 STM32F1片上SRAM抽屉 |! I9 l6 q, b) I 在这个抽屉中,STM32F1只放了64K的SRAM存储空间,其余的空间保留(空着)。这里需要说明一下,虽然其余那些空间被保留,没有存储器与之对应,但是位带别名区的地址仍然可以操作来改变64K地址中的对应位。 / l7 u- L# u) M) E6 @0 L0 M0 I 片上外设抽屉) o E# `% V3 ^/ x0 o. l 在这个抽屉中,放置了STM32F1的外设,包括GPIO、UART、ADC等所有外设的控制、状态、数据寄存器都在这个抽屉中。当然,抽屉很大肯定装不满,装不满的空间就预留着。5 f) f3 l0 O2 C6 U
图5 STM32F1片上外设抽屉2 J: o7 u& C+ a' U7 O 片外RAM抽屉 在这个抽屉中,我们可以自己扩展内存,但必须在STM32的FSMC控制器下进行,这个控制器的作用就是将内部AHB总线和外部扩展内存的总线进行转化,利用这个控制器,我们可以很方便的控制LCD,这里就不展开了。这1G的抽屉可以放下图的东西。这片空间STM32并没有放东西,STM2指定我们可以在其中扩展内存NOR/PSRAM1、NOR/PSRAM2……并接受FSMC控制器的控制。% ~8 z& m: Q& E" C3 h' T2 P
' ^1 z& Q" x$ X8 `, H2 Q0 T" W 图6 STM32F1片外RAM抽屉 ; _ x; i2 l5 u 片外外设抽屉 在这个抽屉中,STM32F1放置了FSMC控制器的一些寄存器,就是在这些寄存器的配合下,FSMC控制器得以有效控制片外RAM进行读写操作。
图7 STM32F1片外外设抽屉 其余的抽屉,STM32F1就没动过了。最后,stm32f1的存储器完整映射如下图所示,大家可以和图1对比了解这个过程。2 j/ k, ~$ R/ H1 T! r8 [. ` . p; |0 M* [1 Z. X+ `: ?$ H s
图8 STM32F1存储器映射6 n1 l$ ?+ f ^, |( r+ _ ————————————————) z% W7 K+ C' L' O 版权声明:fantastikman2 @5 c- L/ h! z; d 如有侵权请联系删除, q2 R" {% \% b, C X . Z( l3 |7 M1 v& Y |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版