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 是相反的操作。

原文地址:https://www.cnblogs.com/cfas/p/11623605.html

时间: 2024-10-12 01:14:55

STM32 外设地址映射管理硬件基地址和偏移地址的相关文章

CPU结构及段地址偏移地址的概念

原文地址:http://blog.csdn.net/yihuiworld/article/details/7533335#comments 程序如何执行: CPU先找到程序在内存中的入口地址 -- 地址总线 (8086有20根地址总线,每一根可以某一时传0或1, 20位的二进制数字可以表示的不同的数字的个数是2^20=1048576 1048576 byte/1024=1024 KB    (注:8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1MB=1024kb=1024

物理地址 = 段地址*10H + 偏移地址

程序如何执行: CPU先找到程序在内存中的入口地址 -- 地址总线 (8086有20根地址总线,每一根可以某一时传0或1, 20位的二进制数字可以表示的不同的数字的个数是2^20=1048576 1048576 byte/1024=1024 KB    (注:8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1MB=1024kb=1024x1024b) 1024KB/1024=1 MB 所以寻址范围为2的20次方byte=1M ) 因此有多少根地址总线(总线宽度)决定了CPU

java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证下之前文章中的结论,再则跟jol输出结果对照下.怎样获取sun.misc.Unsafe对象.能够參考这篇文章. public class VO { public int a = 0; public long b = 0; public static String c= "123"; pub

利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源码有兴趣的可以去看下.现在我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证下之前文章中的结论,再则跟jol输出结果对比下.如何获取sun.misc.Unsafe对象,可以参考这篇文章. [java] view plain copy public class VO { public int a = 0; public long b = 0; public static String c= "

linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 逻辑地址(Logical Address) 包含在机器语言指令中用来指定一个操作数或一条指令的地址(有点深奥).这种寻址方式在80x86著名的分段结构中表现得尤为具体,它促使windows程序员把程序分成若干段.每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离. 线性地址(

STM32外设DMA使用总结

STM32外设DMA使用总结: 1.根据需要选择DAM模式: (1)循环模式-DMA_Mode =  DMA_Mode_Circular (2)正常模式-DMA_Mode =  DMA_Mode_Normal 2.对于DMA1的Chanel3,对应外设为USART3的RX 试想:如果串口接收中断和DAM中断同时打开,CPU如何相应? (1)中断优先级不同:这好说,支持嵌套中断(NVIC)的Cortex-M3自然优先服务中断优先级高的 (2)中断优先级相同:处理原则,先来先处理:若同时到来,中断号

Linux内存管理--虚拟地址、逻辑地址、线性地址和物理地址的区别(二)【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/9668363 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步(如下图): 首先,将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 其次,再利用其页式内存管理单元,转换为最终物理地址. 这样做两次转换,的确是非常麻烦而且没有必要的,

SylixOS电源管理之外设功耗管理

1.前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力.这方面,大自然已经做的很好了,如植物的落叶,如动物的冬眠,等等.而在计算机的世界里称作电源管理(Power Management). 本篇以运行SylixOS的mini2440嵌入式平台为例,分析SylixOS电源管理的外设功耗管理部分. 2.电源管理系统框架 Sylix

[转]IP地址和MAV地址——区别和联系

[转载]http://wenda.tianya.cn/question/27f9476d1e86f6b6 一.IP地址  对于IP地址,相信大家都很熟悉,即指使用TCP/IP协议指定给主机的32位地址.IP地址由用点分隔开的4个8八位组构成,如192.168.0.1就是一个IP地址,这种写法叫点分十进制格式.IP地址由网络地址和主机地址两部分组成,分配给这两部分的位数随地址类(A类.B类.C类等)的不同而不同.网络地址用于路由选择,而主机地址用于在网络或子网内部寻找一个单独的主机.一个IP地址使