**STM32存储器映射**
1、Cortex-M3存储器映射
CM3的地址空间有4G,但它只对这4G空间作了预先的定义,把4G空间分成8个块,每块大小为512M,并指出各段该分给哪些设备。具体的实现由芯片厂商决定,厂商可以设计出具有自己特色的产品。下图是CM3的存储器映射图(来自CM3权威指南)。
1.1、 stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。
RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。
Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失,
RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。
STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。
stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。
一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。
在使用keil进行编写程序时,其编程地址的设置一般是这样的:
程序的写入地址从0x08000000(数好零的个数)开始的,其大小为0x80000也就是512K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000,RAM的地址从0x20000000开始,大小为0x10000也就是64K的RAM。这与STM32的内存地址映射关系是对应的。
M3复位后,从0x08000004取出复位中断的地址,并且跳转到复位中断程序,中断执行完之后会跳到我们的main函数,main函数里边一般是一个死循环,进去后就不会再退出,当有中断发生的时候,M3将PC指针强制跳转回中断向量表,然后根据中断源进入对应的中断函数,执行完中断函数之后,再次返回main函数中。大致的流程就是这样。
1.2、 内部SRAM 区的大小是512MB,用于让芯片制造商连接片上的SRAM,这个区通过系统总线来访问。在这个区的下部,有一个1MB 的位带区,该位带区还有一个对应的32MB 的 “位带别名(alias)区”,容纳了8M 个“位变量”(对比8051 的只有128 个位)。位带区对应的是最低的1MB 地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,像访问普通内存一样地使用它们。位带别名区中的访问操作是原子的,消灭了传统的“读-改-写”三步曲。
地址空间的另一个512MB 范围由片上外设(的寄存器)使用。这个区中也有一条32MB的位带别名,以便于快捷地访问外设寄存器。例如,可以方便地访问各种控制位和状态位。要注意的是,外设内不允许执行指令。
还有两个1GB 的范围,分别用于连接外部RAM 和外部设备,它们之中没有位带。两者的区别在于外部RAM 区允许执行指令,而外部设备区则不允许。
最后还剩下0.5GB 的隐秘地带,CM3 内核的闺房就在这里面,包括了系统级组件、内部私有外设总线s、外部私有外设总线s、以及由提供者定义的系统外设。私有外设总线有两条:
AHB 私有外设总线,只用于CM3 内部的AHB 外设,它们是:NVIC, FPB, DWT 和ITM。
APB 私有外设总线,既用于CM3 内部的APB 设备,也用于外部设备(这里的“外部”是对内核而言)。CM3 允许器件制造商再添加一些片上APB 外设到APB 私有总线上,它们通过ABP 接口来访问。
NVIC 所处的区域叫做“系统控制空间(SCS)”,在SCS 里的还有SysTick、MPU 以及代码调试控制所用的寄存器,如下图所示
最后,未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。
CM3 中的MPU 是选配的,由芯片制造商决定是否配上。
上述的存储器映射只是个粗线条的模板,半导体厂家会提供更展开的图示,来表明芯片中片上外设的具体分布,RAM 与ROM 的容量和位置信息。
2、STM32的存储器映射
从STM32 datasheet上来看,不同的型号,其存储器映射有些不同。应该是以小容量、中容量、大容量来区别的,同一个容量的不同型号,其Flash、SRAM也有所不同,FSMC也不同。下面以STM32F103xx为例分别介绍之,以下数据均来自datasheet及STM32参考手册。
2.1 小容量STM32F103x4、STM32F103x6存储器映射图
2.2 中容量STM32F103x8、STM32F103xB存储器映射图
2.3 大容量STM32F103xC、STM32F103xD、STM32F103xE存储器映射图
总结:上面三幅图中红色字标明了同种容量的芯片的SRAM和Flash大小,不同容量的芯片其外设不一样,但同一外设对应地址是一样的,如果没有相应外设,该地址则保留。拿TIM来说,大容量有TIM2-TIM7,而小容量只有TIM2和TIM3,但它们(TIM2、TIM3)映射的地址却相同,小容量中向上多出的空间则保留,因此RTC在各容量芯片上对应的起始地址都是0X4000 2800。同理SRAM和Flash也是一样。
2.4 SRAM
STM32F10xxx内置了最多为64K的SRAM,它可以以字节、半字(16位)或全字(32位)访问。SRAM的起始地址是0X2000 0000
2.5内部Flash的构成:
STM32 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小如下:
a、主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除,
b、系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。
c、OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。
d、选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。
资料来源:https://blog.csdn.net/leo_ouyang/article/details/17317799
https://blog.csdn.net/qq_33559992/article/details/77676716