stm32的存储规划
我们知道CPU(中央处理器)由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成,单片机工作时处理指令和数据都是需要通过总线寻址控制的,它们是如何通过地址精确地控制设备和数据的呢。
Cortex-M3的内核存储映射
以stm32103为例,首先它使用的是Cortex-M3的内核
Cortex-M3是一个32位处理器内核。内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。CM3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。为实现这个特性, CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。换句话说,不是因为有两条总线,可寻址空间就变成8GB了。
由于设计的是32位的接口,所以总体来说最多只能分配2^32的地址也就是0x00000000~0xFFFFFFFF的地址空间,也就是4G大小
总体来说,Cortex-M3支持4GB地址空间,如图,被划分成了若干部分
让我们先看一看这4GB的划分的具体内容
其中,代码区是存放指令和数据,取指通过指令码(ICode)总线,数据访问借助数据码(DCode)总线。
内部SRAM区的大小是512MB,用于让芯片制造商连接片上的SRAM,也就是ST的STM32芯片,这个区通过系统总线来访问。在这个区的下部,有一个1MB的区间,被称为“位带区”。该位带区还有一个对应的、32MB的 “位带别名(alias)区”,容纳了8M个“位变量”(对比8051的只有128个位变量)。位带区对应的是最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适用于取指。
STM32之bit band 操作理解
另外除了片上外设和片上sram外还分配了两个1g的地址用于连接外部RAM和外部设备,它们之中没有位带,两者之间的区别在于外部RAM区允许执行指令,而外部设备区则不允许。
私有外设总线有两条:
AHB私有外设总线,只用于CM3内部的AHB外设,它们是:NVIC, FPB, DWT和ITM。
APB私有外设总线,既用于CM3内部的APB设备,也用于外部设备(这里的“外部”是对内核而言,在这指stm32的UASRT这些外设,注意总线地址和外设地址的区别)。CM3允许器件制造商再添加一些片上APB外设到APB私有总线上,它们通过APB接口来访问。
STM32的存储映射
因为STM32F103使用的是M3的内核,所以它需要遵守M3预分配的原则
其中
ARM Cortex-M3 存储器映射
以Stm32F103ZE为例,有512kb的flash,64kb的SRAM
1、片上ROM,0x00000000~0x1FFFFFFF上,嵌入式闪存也就是flash分配地址从0x08000000-0x0807FFFF;
其他地址功能如下
嵌入式闪存也就是flash被分配在代码区
2、片上SRAM,在0x20000000~0x3FFFFFFF上,使用地址从0x20000000-0x2000FFFF
这些在keil的配置文件里可以体现
3、像GPIO、USART、TIM这些stm32外设被分配在0x40000000~0x5FFFFFFF中,打开一个库工程文件打开stm32f103x.h文件我们可以看到其中对这些地址的配置,PERIPH_BASE就是外设的基地址,其他的外设都在这个基地址上加上偏移量得到。
看一下stm32的系统架构,不同的外设分布在各自总线上。详见《STM32F10xxx参考手册》2.3节
其他区域参照Cortex-M3的内核存储映射规划