4.1 STM32 系统架构
STM32 的系统架构比 51 单片机就要强大很多了。首先我们看看 STM32 的系统架构图:

图1 系统架构
STM32 主系统主要由四个驱动单元和四个被动单元构成。
四个驱动单元
内核 DCode 总线;
系统总线;
通用 DMA1;
通用 DMA2;
四被动单元
AHB 到 APB 的桥:连接所有的 APB 设备;
内部 FlASH 闪存;
内部 SRAM;
FSMC;
下面我们具体讲解一下图中几个总线的知识:
① ICode 总线:该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。
② DCode 总线:该总线将 M3 内核的 DCode 总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。
③ 系统总线:该总线连接 M3 内核的系统总线到总线矩阵,总线矩阵协调内核和 DMA 间访问。
④ DMA 总线:该总线将 DMA 的 AHB 主控接口与总线矩阵相连,总线矩阵协调 CPU 的DCode 和 DMA 到 SRAM,闪存和外设的访问。
⑤ 总线矩阵:总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用轮换算法。
⑥ AHB/APB 桥:这两个桥在 AHB 和 2 个 APB 总线间提供同步连接, APB1 操作速度限于36MHz,APB2 操作速度全速。
对于系统架构的知识,在刚开始学习 STM32 的时候只需要一个大概的了解,大致知道是个什么情况即可。对于寻址之类的知识,这里就不做深入的讲解。

图2 CMSIS架构
4.2 STM32的地址映射
在分析这个问题之前,我们看看51 单片机中是怎么做的。 51 单片机开发中经常会引用一个 reg51.h 的头文件,下面我们看看他是怎么把名字和寄存器联系起来的:
sfr P0 =0x80;
sfr 也是一种扩充数据类型,占用一个内存单元,值域为 0~255。利用它可以访问 51 单片机内部的所有特殊功能寄存器。如用 sfr P1 = 0x90 这一句定义 P1 为 P1 端口在片内的寄存器。然后我们往地址为 0x80 的寄存器设值的方法是: P0=value;通过改变value的值来控制单片机。

图3 寄存器映射关系
所谓地址映射,就是将芯片上的存储器甚至 I/O 等资源与地址建立一一对应的关系。如果某地址对应着某寄存器,我们就可以运用 C 语言的指针来寻址并修改这个地址上的内容,从而实现修改该寄存器的内容。打个比方,寄存器就像快递员,当你在某宝上买了东西后,快递员就按照地址送到你手上,要想准确无误的送到你手上,就必须保证地址准确无误。
Cortex-M3 的地址映射也是类似的。Cortex-M3 有 32 根地址线,所以它的寻址空间大小为 2 32 bit=4 GB。ARM 公司设计时,预先把这 4 GB 的寻址空间大致地分配好了。它把从 0x40000000 至 0x5FFFFFFF( 512 MB)的地址分配给片上外设。通过把片上外设的寄存器映射到这个地址区,就可以简单地以访问内存的方式,访问这些外设的寄存器,从而控制 外设的工作。这样,片上外设可以使用 C 语言来操作。CM3 存储器映射见图 4- 4。
stm32f10x.h 这个文件中重要的内容就是把 STM32 的所有寄存器进行地址映射。如同51 单片机的 < reg51.h > 头文件一样,stm32f10x.h 像一个大表格,我们在使用的时候就是通过宏定义进行类似查表的操作,大家想象一下没有这个文件的话,我们要怎样访问 STM32的寄存器?有什么缺点?不进行这些宏定义的缺点有 :
1)地址容易写错。
2)我们需要查大量的手册来确定哪个地址对应哪个寄存器。
3)看起来还不好看,且容易造成编程的错误,效率低,影响开发进度。
当然,这些工作都是由 ST 的固件工程师来完成的,只有设计 CM3 的人才是最了解 CM3的,才能写出完美的库。
在这里我们以外接了 LED 灯的外设 GPIOC 为例,如果是其他的 IO 端口,则改成相应的地址即可。在这个文件中一系列宏实现了地址映射。
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x1000
#define PERIPH_BASE ((uint32_t)0x40000000)
这几个宏定义是从文件中的几个部分抽离出来的,具体的内容读者可参考stm32f10x.h 源码。

图4 Cortex-M3 预定义的存储器映射
首先看到 PERIPH_BASE 这个宏,宏展开为 0x40000000,并把它强制转换为 uint32_t的 32 位类型数据,这是因为 STM32 的地址是 32 位的,是不是觉得 0x40000000 这个地址很熟?是的,这是 Cortex-M3 核分配给片上外设 512MB 寻址空间中的第一个地址,我们把0x40000000 称为外设基地址。
接下来是宏 APB2PERIPH_BASE,宏展开为 PERIPH_BASE(外设基地址)加上偏移地址 0x10000,即指向的地址为 0x40010000。这个 APB2PERIPH_BASE 宏是什么地址呢?STM32 不同的外设是挂载在不同的总线上的,见图 4-6。STM32 芯片有 AHB 总线、APB2总线和 APB1 总线,挂载在这些总线上的外设有特定的地址范围。
其中像 GPIO、串口 1、ADC 及部分定时器是挂载在称为 APB2 的总线上,挂载到APB2 总 线 上 的 外 设 地 址 空 间 是 从 0x40010000 至 0x40013FFF 地 址。 这 里 的 第 一个 地 址, 也 就 是 0x40010000,称为 APB2PERIPH_BASE (APB2 总线外设基地址)。
而 APB2 总线基地址相对于外设基地址的偏移量为 0x10000 个地址,即为 APB2 相对外设基地址的偏移地址,见表1。

表1
上一篇:stm32知识学习的先后顺序
下一篇:STM32 USB的实现和软件实现
- 热门资源推荐
- 热门放大器推荐
- 使用 ON Semiconductor 的 FAN2518S 的参考设计
- LTC1530S8、3.3V/3A 稳压器
- 使用 ON Semiconductor 的 ADP3167 的参考设计
- 使用 Analog Devices 的 LT3420EDD 的参考设计
- 基于Kinetis® M的低成本单相电表参考设计
- LTC3708、具有上升/下降轨跟踪功能的 2.5V/15A 和 1.2V/15A 稳压器
- NXQ1TXH5插件板
- 应变仪仪表放大器
- WRL-13287,基于 ESP8266 802.11 无线局域网的 SparkFun Wi-Fi Shield
- 4.1W、3-LED 通用 LED 照明驱动器

现代雷达系统的信号设计
OP413EY

BFR340T






京公网安备 11010802033920号