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的内核存储映射规划

### STM32 存储器映射详解 STM32存储器地址空间被划分为大小相等的8块区域,每块区域大小为512MB(如:0x20000000~0x40000000)。这种划分使得各个功能模块能够有序地分配到特定的地址范围内[^2]。 #### Flash 和 SRAM 的重要性 对STM32存储器知识的掌握,实际上主要集中在对Flash和SRAM这两个区域的理解上。Flash用于存放程序代码以及常量数据;而SRAM则用来保存运行期间产生的临时变量和其他动态数据。这些部分构成了STM32正常工作所必需的基础组件之一。 #### 地址空间的具体分布 具体来说,在STM32内部: - **低地址区 (0x0000_0000 ~ 0x0FFF_FFFF)** 主要由系统ROM、外部设备接口以及其他特殊用途的空间组成; - **中间地址区 (0x2000_0000 ~ 0x3FFF_FFFF)** 是内部SRAM所在的位置,其中包含了多个子区间供不同类型的RAM使用; - **高地址区 (0x4000_0000 ~ 0xFFFF_FFFF)** 则主要用于I/O端口寄存器及其他外设资源的映射[^4]。 对于具体的型号而言,《STM32F103xCDE 数据手册》提供了更详细的memory mapping说明,包括各版本间可能存在差异的地方[^1]。 ```cpp // 示例:访问位于指定基地址处的一个外设寄存器 #define PERIPH_BASE ((uint32_t)0x40000000) // 外设基地址 #define GPIOA_OFFSET ((uint32_t)0x00000800) // GPIOA偏移量 #define GPIOA ((GPIO_TypeDef *) (PERIPH_BASE + GPIOA_OFFSET)) ``` 上述代码展示了如何定义并访问一个位于固定位置上的外设寄存器实例。这里`PERIPH_BASE`代表所有外设共享的基本起点,而`GPIOA_OFFSET`则是相对于该基础之上的额外位移值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值