STM32 外设地址映射管理硬件基地址和偏移地址

片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设, APB1 挂载低速外设,APB2 和 AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。APB1 总线的地址最低,因此片上外设就从这这个地址开始,也称外设基地址。

(1)总线基地址

从存储器映射那张图的 Block2 可以看到,分为 4 大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块地址出现偏差,这个差值就是偏移量,即相对基地址的偏移量。如图5.3.1 所示。

从上图可以看到 APB1 总线基地址是 0x4000 0000,相对外设基地址的偏移量是 0,所以此总线也是外设 Block2 的基地址。

(2)外设基地址

每条总线上都会挂接着很多的外设,这些外设也会有自己的地址范围,XXX 外设的首个地址即最低地址就是 XXX 外设的基地址,也称作 XXX 边界地址。有关 STM32F1xx 外设的具体边界地址可以参考《STM32F1xx 中文参考手册》P28 页,里面有详细的介绍。这里我们就以 GPIO 外设来讲解外设基地址。其他的外设也是同样分析。GPIO 外设基地址如图 5.3.2 所示。

从图 5.3.2 可以知道,外设 GPIOx 都是挂接在 APB2 总线上,属于高速的外设,而 APB2 总线的基地址是 0x4001 0000,故 GPIOA 的相对 APB2 总线的地址偏移是 800。

(3)外设寄存器地址

XXX 外设的寄存器就分布在其对应的外设地址范围内。这里我们以 GPIO 外设为例,GPIO 是通用输入输出端口的简称,可以通过软件来控制其输入和输出。GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节,这些寄存器都是按顺序依次排列在外设的基地址上。寄存器的位置都以相对该外设基地址的偏移地址来描述。这里我们以 GPIOC 端口为例,来说明 GPIO都有哪些寄存器,如图 5.3.3 所示。

这里我们就以 GPIOC_BSRR 寄存器来教大家如何看《STM32F1xx 中文参考手册》内寄存器的说明。大家如果想要了解更多的寄存器内容,可以参考《STM32F1xx中文参考手册》相应寄存器外设部分。

首先我们需要打开 STM32 中文参考手册,然后找到 GPIO 外设章节,里面会有一个 GPIO 寄存器,只要找到我们所要查找的寄存器即可,如图 5.3.4 所示。

下面我们就对图 5.3.4 进行分析,带领大家这么获取其中的信息。

A.红色框 4 表示的我们所查找寄存器的名称,寄存器 GPIOx_BSRR 内的 x 表示的是 STM32GPIO 端口,范围是 A-E,也就是说在 GPIOA、GPIOB 等端口中都有这个寄存器。

B.红色框 5 表示的是相对 GPIOx 地址的偏移值,比如现在我们使用的是GPIOC 外设,其基地址是 0x4001 1000,那么本寄存器 GPIOx_BSRR 地址=0x40011000+0x10=0x4001 1010。对于其他的 GPIO 外设也是一个原理。

C.红色框 6 和 7 表示的是寄存器的位表。其中 6 表示寄存器编号,因为一个寄存器是 32bit,所以范围是 0-31。7 表示的是相应位的权限,w:只写,r:只读,rw:可读可写。本寄存器位权限是 w,所以只能写,如果试图读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位权限为只读,一般是用于表示STM32 外设的某种工作状态的,由 STM32 硬件自动更改,通过读取那些寄存器位来判断外设的工作状态。

D.红色框 8 是寄存器位功能说明。这个也是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。例如本寄存器中有两种寄存器位,分别为BRy 及 BSy,其中的 y 数值表示的是管脚号,可以是 0-15。如 BR0、BS0 用于控制 GPIOx 的第 0 个引脚,若 x 表示 GPIOC,那就是控制 GPIOC 的第 0 引脚,而 BR1、BS1 就是控制 GPIOC 第 1 个引脚。

其中 BRy 引脚的说明是“ 0:不会对相应的 ODRx 位执行任何操作; 1:对相应 ODRx 位进行复位”。这里的“复位”是将该位设置为 0 的意思,而“置位”表示将该位设置为 1;说明中的 ODRx 是另一个寄存器的寄存器位,我们只需要知道 ODRx 位为 1 的时候,对应的引脚 x 输出高电平,为 0 的时候对应的引脚输出低电平即可(感兴趣的读者可以查询该寄存器 GPIOx_ODR 的说明了解)。所以,如果对 BR0 写入“ 1”的话,那么 GPIOx 的第 0 个引脚就会输出“低电平”,但是对 BR0 写入“ 0”的话,却不会影响 ODR0 位,所以引脚电平不会改变。要想该引脚输出“高电平”,就需要对“ BS0”位写入“ 1”,寄存器位 BSy 与 BRy 是相反的操作。

java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/cfas/p/11623605.html