-
2021-04-11 13:17:46
寄存器(Register)是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
在此主要介绍几个常用的寄存器
在CPU中至少要存在六种寄存器
- 指令寄存器(IR)
- 程序计数器(PC)
- 地址寄存器(AR)
- 数据寄存器(DR)
- 累加寄存器(AC)
- 程序状态字寄存器(PSW)。
这些寄存器用来暂存一个计算机字,其数目可以根据需要进行扩充。
数据寄存器
Data Register,主要用来由主存读取的一条指令或一个数据字
扩展:一个字 = 16bit
地址寄存器
Address Register,来保存CPU当前所访问的主存单元的地址。
由于在主存和CPU之间存在操作速度上的差异,所以必须使用地址寄存器来暂时保存主存的地址信息,直到主存的存取操作完成为止。
程序计数器
Program Counter,用来指出下一条指令在主存储器中的地址,在程序执行之前,首先必须将程序的首地址,即程序第一条指令所在主存单元的地址送入PC,因此PC的内容即是从主存提取的第一条指令的地址
累加寄存器
Accumulator,一个通用寄存器。当运算器的算术逻辑单元ALU执行算术或逻辑运算时,为ALU提供一个工作区,可以为ALU暂时保存一个操作数或运算结果
指令寄存器
Instruction Register,用来保存当前正在执行的一条指令,当执行一条指令时,首先把该指令从主存读取到数据寄存器中,然后再传送至指令寄存器
指令:操作码+地址码
程序状态字寄存器
Program Status Word,来表征当前运算的状态及程序的工作方式,程序状态字寄存器是一个保存各种状态条件标志的寄存器
更多相关内容 -
嵌入式系统/ARM技术中的ARM通用寄存器
2020-11-13 04:18:27在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特中数据的破坏。 2.分组寄存器R8~R14 对于分组寄存器,它们每一次所访问的物理寄存器与处理器当前的运行模式有关。对于R8~R12... -
modbus协议中的线圈、寄存器等的解释
2021-01-06 03:25:450x01: 读线圈寄存器 0x02: 读离散输入寄存器 0x03: 读保持寄存器 0x04: 读输入寄存器 0x05: 写单个线圈寄存器 0x06: 写单个保持寄存器 0x0f: 写多个线圈寄存器 0x10: 写多个保持寄存器 如上所示... -
寄存器,寄存器是什么意思
2021-07-28 06:43:33寄存器,寄存器是什么意思寄存器定义寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器...寄存器,寄存器是什么意思
寄存器定义
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。
寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 “架构寄存器”。
例如,x86 指令集定义八个 32 位元寄存器的集合,但一个实作 x86 指令集的 CPU 可以包含比八个更多的寄存器。
寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
特点及原理
寄存器又分为内部寄存器与外部寄存器,所谓内部寄存器,其实也是一些小的存储单元,也能存储数据。但同存储器相比,寄存器又有自己独有的特点:
①寄存器位于CPU内部,数量很少,仅十四个;
②寄存器所能存储的数据不一定是8bit,有一些寄存器可以存储16bit数据,对于386/486处理器中的一些寄存器则能存储32bit数据;
③每个内部寄存器都有一个名字,而没有类似存储器的地址编号。
寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过“端口”交换数据,外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为“端口”,这种说法不太严格,但经常这样说。
外部寄存器虽然也用于存放数据,但是它保存的数据具有特殊的用途。某些寄存器中各个位的0、1状态反映了外部设备的工作状态或方式;还有一些寄存器中的各个位可对外部设备进行控制;也有一些端口作为CPU同外部设备交换数据的通路。所以说,端口是CPU和外设间的联系桥梁。CPU对端口的访问也是依据端口的“编号”(地址),这一点又和访问存储器一样。不过考虑到机器所联接的外设数量并不多,所以在设计机器的时候仅安排了1024个端口地址,端口地址范围为0--3FFH。
寄存器用途
1.可将寄存器内的数据执行算术及逻辑运算;
2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;
3.可以用来读写数据到电脑的周边设备。
数据寄存器
8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。
(1)通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个).
顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。
数据寄存器分为:
AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.
BH&BL=BX(base):基址寄存器,常用于地址索引;
CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。
另一组是指针寄存器和变址寄存器,包括:
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;
SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。
这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
(2) 指令指针IP(Instruction Pointer)
指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动加1,指向下一个指令字节。注意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address)。
(3)标志寄存器FR(Flag Register)
8086有一个18位的标志寄存器FR,在FR中有意义的有9位,其中6位是状态位,3位是控制位。
OF: 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
DF:方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
IF:中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
TF:跟踪标志TF。该标志可用于程序调试。TF标志没有专门的指令来设置或清楚。
(1)如果TF=1,则CPU处于单步执行指令的工作方式,此时每执行完一条指令,就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指令。
(2)如果TF=0,则处于连续工作模式。
SF:符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。当运算结果没有产生溢出时,运算结果等于逻辑结果(即因该得到的正确的结果),此时SF表示的是逻辑结果的正负,当运算结果产生溢出时,运算结果不等于逻辑结果,此时的SF值所表示的正负情况与逻辑结果相反,即:SF=0时,逻辑结果为负,SF=1时,逻辑结果为正。
ZF: 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
AF:下列情况下,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
PF:奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
CF:进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
(4)段寄存器(Segment Register)
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。
以上是8086寄存器的整体概况, 自80386开始,PC进入32bit时代,其寻址方式,寄存器大小,功能等都发生了变化。
=============================以下是80386的寄存器的一些资料======================================
寄存器都是32-bits宽。
A、通用寄存器
下面介绍通用寄存器及其习惯用法。顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。通用寄存器最多的用途是计算。
EAX:通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器)
EBX:通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。
ECX:通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,DS作为 寄存器或段选择器)。
EDX:通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器)。
同AX分为AH&AL一样,上述寄存器包括对应的16-bit分组和8-bit分组。
B、用作内存指针的特殊寄存器
ESI:通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。
EDI:通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。
EBP:这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧'来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望的任何数据。SS是它的默认段寄存器或选择器。
注意,这三个寄存器没有对应的8-bit分组。换言之,你可以通过SI、DI、BP作为别名访问他们的低16位,却没有办法直接访问他们的低8位。
C、段选择器:
实模式下的段寄存器到保护模式下摇身一变就成了选择器。不同的是,实模式下的“段寄存器”是16-bit的,而保护模式下的选择器是32-bit的。
CS 代码段,或代码选择器。同IP寄存器(稍后介绍)一同指向当前正在执行的那个地址。处理器执行时从这个寄存器指向的段(实模式)或内存(保护模式)中获取指令。除了跳转或其他分支指令之外,你无法修改这个寄存器的内容。
DS 数据段,或数据选择器。这个寄存器的低16 bit连同ESI一同指向的指令将要处理的内存。同时,所有的内存操作指令 默认情况下都用它指定操作段(实模式)或内存(作为选择器,在保护模式。这个寄存器可以被装入任意数值,然而在这么做的时候需要小心一些。方法是,首先把数据送给AX,然后再把它从AX传送给DS(当然,也可以通过堆栈来做).
ES 附加段,或附加选择器。这个寄存器的低16 bit连同EDI一同指向的指令将要处理的内存。同样的,这个寄存器可以被装入任意数值,方法和DS类似。
FS F段或F选择器(推测F可能是Free?)。可以用这个寄存器作为默认段寄存器或选择器的一个替代品。它可以被装入任何数值,方法和DS类似。
GS G段或G选择器(G的意义和F一样,没有在Intel的文档中解释)。它和FS几乎完全一样。
SS 堆栈段或堆栈选择器。这个寄存器的低16 bit连同ESP一同指向下一次堆栈操作(push和pop)所要使用的堆栈地址。这个寄存器也可以被装入任意数值,你可以通过入栈和出栈操作来给他赋值,不过由于堆栈对于很多操作有很重要的意义,因此,不正确的修改有可能造成对堆栈的破坏。
* 注意 一定不要在初学汇编的阶段把这些寄存器弄混。他们非常重要,而一旦你掌握了他们,你就可以对他们做任意的操作了。段寄存器,或选择器,在没有指定的情况下都是使用默认的那个。这句话在现在看来可能有点稀里糊涂,不过你很快就会在后面知道如何去做。
指令指针寄存器:
EIP 这个寄存器非常的重要。这是一个32位宽的寄存器 ,同CS一同指向即将执行的那条指令的地址。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。(CS是默认的段或选择器)
上面是最基本的寄存器。下面是一些其他的寄存器,你甚至可能没有听说过它们。(都是32位宽):
CR0, CR2, CR3(控制寄存器)。举一个例子,CR0的作用是切换实模式和保护模式。
还有其他一些寄存器,D0, D1, D2, D3, D6和D7(调试寄存器)。他们可以作为调试器的硬件支持来设置条件断点。
TR3, TR4, TR5, TR6 和 TR? 寄存器(测试寄存器)用于某些条件测试。
寄存器分类
数据寄存器 - 用来储存整数数字(参考以下的浮点寄存器)。在某些简单/旧的 CPU,特别的数据寄存器是累加器,作为数学计算之用。
地址寄存器 - 持有存储器地址,以及用来访问存储器。在某些简单/旧的CPU里,特别的地址寄存器是索引寄存器(可能出现一个或多个)。
通用目的寄存器 (GPRs) - 可以保存数据或地址两者,也就是说他们是结合 数据/地址 寄存器的功用。
浮点寄存器 (FPRs) - 用来储存浮点数字。
常数寄存器 - 用来持有只读的数值(例如 0、1、圆周率等等)。
向量寄存器 - 用来储存由向量处理器运行SIMD(Single Instruction, Multiple Data)指令所得到的数据。
特殊目的寄存器 - 储存CPU内部的数据,像是程序计数器(或称为指令指针),堆栈寄存器,以及状态寄存器(或称微处理器状态字组)。
指令寄存器(instruction register) - 储存现在正在被运行的指令
索引寄存器(index register) - 是在程序运行实用来更改运算对象地址之用。
在某些架构下,模式指示寄存器(也称为“机器指示寄存器”)储存和设置跟处理器自己有关的数据。由于他们的意图目的是附加到特定处理器的设计,因此他们并不被预期会成微处理器世代之间保留的标准。
有关从 随机存取存储器 提取信息的寄存器与CPU(位于不同芯片的储存寄存器集合)
存储器缓冲寄存器(Memory buffer register)
存储器数据寄存器(Memory data register)
存储器地址寄存器(Memory address register)
存储器型态范围寄存器(Memory Type Range Registers)[1][2]
寄存器:
寄存器是计算机和其他数字系统中用来存储代码或数据的逻辑部件。它的主要组成部分是触发器。一个触发器能存储1位二进制代码,所以要存储n位二进制代码的寄存器就需要用n个触发器组成。一个4位的集成寄存器74LS175的逻辑电路图和引脚图分别如图8.7.1(a)、(b)所示。其中,RD是异步清零控制端。在往寄存器中寄存数据或代码之前,必须先将寄存器清零,否则有可能出错。1D~4D 是数据输入端,在CP 脉冲上升沿作用下,1D~4D端的数据被并行地存入寄存器。输出数据可以并行从1Q~4Q 端引出,也可以并行从1Q~4Q 端引出反码输出。
74LS175的功能如表8.7.1所示。
上面介绍的寄存器只有寄存数据或代码的功能。有时为了处理数据,需要将寄存器中的各位数据在移位控制信号作用下,依次向高位或向低位移动1位。具有移位功能的寄存器称为移位寄存器。
-
元器件应用中的RTC相关寄存器
2020-11-13 02:51:38RTC一般都是通过设置其寄存器来实现相应的功能的。下面将详细给出RTC相关寄存器说明。 RTC控制寄存器说明如表1所示。 表1 控制寄存器(RTCCON)说明 (2)RTCALM(报警控制寄存器) RTCALM寄存器设置... -
寄存器、累加器、暂存器有什么区别?
2021-01-20 01:05:33什么是寄存器 寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成。在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类。内部寄存器不能被外部电路或软件访问,只是为... -
三菱PLC编程软件GX WORKS3中如何查找特殊软元件和寄存器?.docx
2021-05-14 08:18:44三菱PLC编程软件GX WORKS3中如何查找特殊软元件和寄存器? -
寄存器bit位查看工具,显示寄存器每bit值
2020-03-07 08:52:35寄存器bit查看工具,显示寄存器每bit值,寄存器bit查看工具,显示寄存器每bit值,寄存器bit查看工具,显示寄存器每bit值寄存器bit查看工具,显示寄存器每bit值 -
Verilog寄存器堆的实现代码
2020-12-19 12:44:14Verilog寄存器堆的实现代码 -
STM32学习——什么是寄存器(存储器映射和寄存器映射)
2021-12-27 11:14:29STM32芯片里面有什么 我们看到的STM32芯片是已经封装好阿成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU和主板、内存、显卡、硬盘的关系。 STM32F103采用的是Cortex-M3内核,内核即...目录
STM32芯片里面有什么
我们看到的STM32芯片是已经封装好阿成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU和主板、内存、显卡、硬盘的关系。
STM32F103采用的是Cortex-M3内核,内核即CPU,由ARM公司设计,ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如GPIO、USART(串口)、I2C、SPI等都叫片上外设。具体见下图STM32芯片架构简图。
芯片(这里指内核,或者叫CPU)和外设之间通过各种总线连接,其中驱动单元4个,被动单元也有4个。为了方便理解,我们都可以把驱动单元理解成是CPU部分,被动单元都理解外设。
一、驱动单元
1、ICode总线
ICode中的I表示Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在FLASH中,内核要读取这些指令来执行程序就必须通过ICode总线,它几乎每时每刻都需要被使用,它是专门用来取指令的。
2、DCode总线
DCode总线中的D表示Data,即数据,那说明这条总线是用来取数据的。我们在写程序的时候,数据有常量和变量两种,常量就是固定不变的,用C语言中的const来修饰的,是放到FLASH当中的,变量是可变的,不管是全局变量还是局部变量都存放在内部的SRAM中。因为数据可以被DCode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
3、系统总线
系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这跟系统总线来完成的。
4、DMA总线
DMA总线也主要是用来,传输数据,这个数据可以是在某个外设的数据寄存器,可以在SRAM,可以在内部的FLASH。因为数据可以被DCode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
二、被动单元
1、内部的闪存存储器
内部的闪存存储器即FLASH,我们编写好的程序就放在这个地方。内核通过ICode总线来取里面的指令。
2、内部的SRAM
内部的SRAM,即我们通常常说的RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过DCode总线来访问它。
3、FSMC
FSMC的英文全称是Flexible static memory controller,叫灵活的静态的存储器控制器,是STM32F10xx中一个很有特色的外设,通过FSMC,我们可以扩展内存,如外部的SRAM、NAND-FLASH和NORFLASH。但我们有一点要注意的是,FSMC只能扩展静态的内存,即名称里面的static,不能是动态的内存,比如SDRAM就不能扩展。
4、AHB到APB的桥
从AHB总线延伸出来的两条APB2和APB1总线,上面挂载着STM32的各种各样的外设。我们经常说的GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上,这个是我们学习STM32的重点,就是要学会编程这些外设的驱动外部的各种设备。
存储器映射
存储器本身具备有地址信息,它的地址是由芯片厂商或由用户分配,给存储器分配地址的过程就称为存储器映射,具体可见下面的存储器映射。如果给存储器再分配一个地址就叫存储器重映射。
存储器区域功能划分
在这4GB地址的空间内,ARM已经粗线条的平均分成了8个块,每块512MB,每个块也都规定了用途,具体分类见表格存储器功能分类。每个块的大小都有512MB,显然这是一块非常大的区域,芯片厂商在每个块的范围内设计各具特色的外设时并不一定用得完,都是只用了其中一部分。
序号 用途 地址范围 Block0 Code 0x0000 0000~0x1FFF FFFF(512MB) Block1 SRAM 0x2000 0000~0x3FFF FFFF(512MB) Block2 片上外设 0x4000 0000~0x5FFF FFFF(512MB) Block3 FSMC的bank1~bank2 0x6000 0000~0x7FFF FFFF(512MB) Block4 FSMC的bank3~bank4 0x8000 0000~0x9FFF FFFF(512MB) Block5 FSMC寄存器 0xA000 0000~0xCFFF FFFF(512MB) Block6 没有使用 0xD000 0000~0xDFFF FFFF(512MB) Block7 Cortex-M3内部外设 0xE000 0000~0xFFFF FFFF(512MB) 在这8个块里面有三个块非常重要,Block0用来设计内部FLASH,Block1用来设计内部RAM,Block2用来设计成片上的外设。
寄存器映射
寄存器映射:给已经分配好地址的具有特定功能的内存单元取别名的过程就叫寄存器映射。
比如,我们先找到GPIOB的端口的输出数据寄存器ODR的地址是0x40010C0C,ODR寄存器是32位的,低16位有效,对应着16个外部IO,写0/1对应的IO输出对应的低/高电平。
//GPIO端口全部输出高电平 *(unsigned int*) (0x40010C0C) = 0xFFFF; 0x40010C0C在我们看来是GPIOB的端口的ODR地址,但是在编译器看来, 这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针, 我们得进行强制类型转换,把它转换成指针,即(unsigned int*)0x40010C0C, 然后对这个地址进行*操作。 通过寄存器别名的方式访问内存单元 //GPIOB端口全部输出高电平 #define GPIOB_ODR (unsigned int*)(GPIOB_BASE + 0x0C) *GPIOB_ODR = 0xFF; 为了方便操作,直接把指针操作"*"也定义到寄存器别名中。 //GPIOB端口全部输出高电平 #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE + 0x0C) GPIOB_ODR = 0xFF;
三、STM32的外设基地址映射
片上外设区分三条总线,根据外设速度的不同,不同总线挂在着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。相应的总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中APB1总线的地址最低,片上外设从这里开始,也叫外设基地址。
1、总线基地址
总线名称 总线基地址 相对外设基地址的偏移 APB1 0x4000 0000 0x0 APB2 0x4001 0000 0x0001 0000 AHB 0x4001 8000 0x0001 8000 表格总线基地址的“相对外设基地址偏移”即该总线地址与“片上外设”基地址0x4000 0000的差值。
2、外设基地址
总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的收个地址“称为XX外设基地址”,也叫XX外设的边界地址。具体有关的STM32F10xx外设的边界地址可以参考具体的存储器映射的表。
这里以GPIO这个外设来讲解外设的基地址,GPIO属于高速的外设,挂载到APB2总线上。
外设名称 外设基地址 相对APB2总线的地址偏移 GPIOA 0x4001 0800 0x0000 0800
GPIOB 0x4001 0C00 0x0000 0C00 GPIOC 0x4001 1000 0x0000 1000 GPIOD 0x4001 1400 0x0000 1400 GPIOE 0x4001 1800 0x0000 1800 GPIOF 0x4001 1C00 0x0000 1C00 GPIOG 0x4001 2000 0x0000 2000 3、外设寄存器
在XX外设的地址范围内,分布着的就是该外设的寄存器。以GPIO外设为例,GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,基本功能是控制引脚输出高低电平。
GPIO有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占4个字节,在改外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。这里我们以GPIOB端口为例,来说明GPIO都有哪些寄存器,具体见表格GPIOB端口的寄存器地址列表。
寄存器名称 寄存器地址 相对GPIOB基址的偏移 GPIOB_CRL 0x4001 0C00 0x00 GPIOB_CRH 0x4001 0C04 0x04 GPIOB_IDR 0x4001 0C08 0x08 GPIOB_ODR 0x4001 0C0C 0x0C GPIOB_BSRR 0x4001 0C10 0x10 GPIOB_BRR 0x4001 0C14 0x14 GPIOB_LCKR 0x4001 0C18 0x18 这里我们以“GPIO端口置位/复位寄存器为例”,教大家如何理解寄存器的说明,具体见GPIO端口置位_复位寄存器说明。
1、名称
寄存器说明中首先列出了该寄存器中的名称,“(GPIOx_BSRR)(x=A...E)”这段的意思是该寄存器名为”GPIOx_BSRR“其中的x可以为”A...E“,也就是说这个寄存器说明适用于GPIOA、GPIOB至GPIOE,这些端口都有这样一个寄存器。
2、偏移地址
偏移地址是指本寄存器相对于这个外设的基地址的偏移。本寄存器的偏移地址是0x10,从手册可以查到GPIOA这个外设的基地址为0x4001 0800,我们就可以算出GPIOA这个GPIOA_BSRR寄存器地址为:0x4001 0800+0x10。
3、寄存器位表
紧接着的就是本寄存器的位表,表中列出了0-31位的名称及权限。表上方的数字为位编号,中间为位名称,最下方为读写权限,其中w表示只写,r表示只读,rw表示可读写。本寄存器中的位权限都是w,所以只能写,如果读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位只读,一般是用于STM32外设的某种工作状态的,由STM32硬件自动生效,程序通过读取那些寄存器位来判断外设的工作状态。
4、位功能说明
位功能是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。这里不再详细讲解。
-
什么是通用寄存器?
2021-12-24 16:57:02通用寄存器:这类寄存器在处理器中数量较多、使用频度较高,具有多种用途。例如它们可用来存放指令需要的操作数据,又可用来存放地址以便在主存或I/O接口中指定操作数据的位置。 通用寄存器(General-Purpose ...通用寄存器:这类寄存器在处理器中数量较多、使用频度较高,具有多种用途。例如它们可用来存放指令需要的操作数据,又可用来存放地址以便在主存或I/O接口中指定操作数据的位置。
通用寄存器(General-Purpose Register)一般是指处理器最常使用的整数通用寄存器,可用于保存整数数据、地址等。8086处理器只有8个通用寄存器,数量有限。8086 处理器的 8 个 16 位通用寄存器,分别被命名为:AX、BX、CX、DX、SI、DI、BP和SP。其中前4个通用寄存器AX、BX、CX和DX还可以进一步分成高字节H(High)和低字节L(Low)两部分,这样又有了8个8位通用寄存器:AH和AL、BH和BL、CH和CL、DH和DL。前4个通用寄存器在编程中,可以整个使用16位寄存器(例如:AX),也可以分成两个8位使用:D15~D8(例如:AH)和D7~D0(例如:AL),对其中某8位的操作,并不影响另外对应8位的数据。
通用寄存器的用途很多,可以保存数据、暂存运算结果,也可以存放存储器地址、作为变量的指针。但在 8086 处理器中每个寄存器又有它们各自的特定作用,并因而得名。程序中通常也按照其含义使用它们
许多指令需要表达两个操作数(操作对象,例如加法指令的被加数以及加法结果):- 源操作数是指被传送或参与运算的操作数(例如:加法的被加数)。
- 目的操作数是指保存传送结果或运算结果的操作数(例如:加法的和值结果)。
SI和DI是变址寄存器,常通过改变寄存器表达的地址指向数组元素。SI常用于指向源操作数,而DI常用于指向目的操作数。
堆栈(Stack)是一个特殊的存储区域,它采用先进后出FILO(First In Last Out)、也称为后进先出LIFO(Last In First Out)的操作方式存取数据。它用于调用子程序时暂存数据、传递参数、存放局部变量,也可以用于临时保存数据。BP和SP是指针寄存器,用于指向堆栈中的数据。其中,SP堆栈指针会随着处理器执行有关指令自动增大或减小,所以SP不应该再用于其他目的,实际上可归类为专用寄存器;但是 SP 又可以像其他通用寄存器一样灵活地改变。
-
8086CPU中14个寄存器的详解
2022-02-17 08:58:52CPU中的寄存器 在执行单元EU和总线接口单元BIU中一共有14个寄存器,其中通用寄存器8个、标志寄存器FLAGS一个、控制寄存器5个。...AH+AL等)来使用,但是一定要注意“8086为16位寄存器,8位寄存器中存放的一定是数 -
CPU中的通用寄存器
2021-01-12 00:01:58因此为CPU中的寄存器取名为通用寄存器。16位CPU有14个通用寄存器,32位CPU有16个通用寄存器。下面以32位CPU为例介绍各个通用寄存器的作用。 数据寄存器 EAX EBX ECX EDX 数据寄存器主要用于保存运算的操作数和运算... -
MPU9250寄存器参考手册中文版
2019-05-05 14:16:32MPU9250中文寄存器资料,独家翻译,全网仅此一份,现用于开源用途。 -
STM32新手入门-什么是寄存器
2022-03-28 17:01:21前言 俗话说得好地基不牢地动山摇,要想学好单片机必须要非常熟悉底原理,毕竟我们这是底层开发所以接触到越底层越好,能让我们知道每一句代码在做什么,单片机的本质其实就是在操作寄存器,让单片机完成我们想要的... -
姿态传感器MPU6050寄存器手册(中文版).zip
2019-08-15 16:37:31MPU6050的所有寄存器都可以在官方文档“MPU-6000 and MPU-6050 Register Map and Descriptions”中找到,平时使用中最为重要的有以下几种:电源管理寄存器1和2、陀螺仪配置寄存器、陀螺仪采样率分频寄存器、加速度... -
寄存器分类
2020-11-13 04:36:40左移寄存器是指在时钟脉冲的作用下,低位寄存器的数码送给高位寄存器,作为高位寄存器的次态输出;右移寄存器是指在时钟脉冲的作用下,高位寄存器的数码送给低位寄存器,作为低位寄存器的次态输出。 欢迎转载,信息... -
计算机组成原理-第一次实验寄存器A
2018-09-21 14:03:51实验一 寄存器A,W实验 一、实验要求 利用COP2000实验仪上的K16..K23开关做为DBUS的数据,其它开关做为控制信号,将数据写入寄存器,这些寄存器包括累加器A,...了解模型机中A和W寄存器结构、工作原理及其控制方法。 -
寄存器到底是个什么东西?
2019-11-16 17:18:38一. 什么是寄存器?什么是寄存器映射? 给有特定功能的内存单元取一个别名,这个别名就是我们常说的寄存器,取名的过程就叫寄存器映射。 你用define宏定义去操作的,其实就是最底层的内存地址,只不过我们操作的... -
mpu9250寄存器手册
2017-10-25 11:19:00mpu9250寄存器手册英文版,主要用于对mpu9250编程时对寄存器操作。 -
什么是段寄存器,数据寄存器
2020-04-01 12:18:19寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。 2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边... -
标志寄存器中af和pf的定义及用途
2021-07-28 06:43:268086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。(1)通用寄存器有8个, 又可以...在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一... -
STM32寄存器的简介、地址查找,与直接操作寄存器
2019-01-11 11:15:15什么是寄存器 提到单片机,就不得不提到寄存器。根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 简单来说,寄存器就是存放东西的... -
LINUX平台下命令行访问ethernet phy 的寄存器工具
2020-06-09 15:03:49个人写的LINUX平台下,命令行访问ethernet phy 的寄存器工具,驱动和硬件调试非常实用。具体使用如下: 打印寄存器:./mdio eth0 dump 修改寄存器:./mdio eth0 0x00 0x1200,修改0x00寄存器的值为0x1200 -
在KEIL中如何查看寄存器的值与地址
2019-04-08 22:46:35正确连接硬件,编译程序后,按下工具栏的调试按钮进入调试模式。...例如AHBIENR寄存器的值是0x0010 0084,将此十六进制的数据按照二进制展开,在数据手册中找到相应的寄存器,按位对照,并借助说明即可理... -
寄存器是什么 有什么作用
2016-11-16 10:32:41寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。 寄存器的用途: 1.可将寄存器内的数据执行算术及逻辑运算。 2.存于寄存器内的地址可用来指向内存的某个位置,即... -
寄存器
2018-08-08 18:37:35在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,存器有累加器(ACC) 2.包括通用寄存器、专用寄存器和控制寄存器 3.分类 数据寄存器- 用来储存... -
modbus协议中的寄存器理解
2018-02-26 09:54:35最近有用到modbus协议,就把之前原来收集的资料全都拿出来又复习了一遍。发现以前了解的也忘了差不多...具体如下: 0x01: 读线圈寄存器 0x02: 读离散输入寄存器 0x03: 读保持寄存器 0x04: 读输入寄存器 0x05: ... -
段寄存器
2021-01-15 12:46:20一、段寄存器有哪些 ? 段寄存器有ES、CS、SS、DS、FS、GS、LDTR、TR共8个。...在x86下.我们可以看如下寄存器表示图. 寄存器名称 段选择子(Select) 段属性(Attributes) . -
在CPU的寄存器中,()对用户是完全透明的。
2020-06-16 11:03:24在CPU的寄存器中,()对用户是完全透明的。 A.程序计数器 B.指令寄存器 C.状态寄存器 D.通用寄存器 答案:【B】 解析: 首先,了解一下计算机网络对用户“透明”是什么意思? 1、“透明”一次在计算机领域通常是指...