电子说
大家都认为计算机可以做任何事,对我们的生活有巨大的作用,尤其是在学习单片机的过程中。学习计算机可以教会我们分析和解决问题,而学习单片机可以帮助我们更好地理解计算机如何根据我们的想法解决问题。本文带你了解寄存器,它将伴随学习单片机的全过程。寄存器是连接硬件和软件的重要纽带。计算机的任何功能都离不开寄存器。中央处理器也有寄存器。总线通信、通过注册、内存分页等一切都基于寄存器。电子洞和多彩的计算机世界之间有更多的寄存器,如链接。它们看起来很复杂,但它们很清楚。即便所有的计算机一夜之间突然消失,人类也可以从电子管和打孔纸带开始,一层一层地构建计算机世界。我们所知道的只是这个庞大系统中的沧海一粟。
1.什么是寄存器
寄存器是CPU内部的一种存储器,分为通用寄存器和特殊功能寄存器(8086也细分为特殊功能寄存器)。通用寄存器,顾名思义是通用的。它们可以存储操作数、运算结果、内存地址等数据,在用C语言编程时,编译器一般负责安排通用寄存器的使用,无需直接联系它们。特殊功能寄存器具有特定功能,其中一些作用于CPU,比如PC存放下一条指令的地址,SP记录栈顶在内存中的位置,其中一些与IO模块相连,单片机程序通过这些寄存器控制各种外设。
我们通常使用的单片机是atmega324pa,它的封装种类很多,管脚数量不同,但通用输入输出(GPIO)管脚有32个。由于AVR架构是8位字长,因此CPU一次处理1位数据和8位数据所需的时间相同。32个引脚被组织成4个端口,即PA、Pb、PC和PD。在微型和微型微控制器的AVR架构中,每个端口都有三个寄存器来控制数字信号IO,分别是portx、ddrx和PINX。这里的X是a、B、C或D。由于四个端口在数字IO方面是相同的,我们将它们组合起来。因此,对于每个引脚Pxn,有3个位,portxn、ddxn(不带R)和pinxn,来控制其数字io。
ddxn控制引脚方向:ddxn为1时,输出Pxn;当ddxn为0时,输入Pxn。
当输入Pxn时,如果portxn为1,则该引脚通过上拉电阻连接到VCC;否则,引脚悬空。
输出Pxn时,若portxn为1,引脚输出高电平;否则,引脚输出低电平。
pinxn的值是Pxn引脚的电平。如果将1写入pinxn,则portxn的值会翻转。
寄存器还有很多细节,比如MCUCR寄存器中PUD位的作用、复位后寄存器的值、输入/输出切换的方法、读取引脚电平的延迟、未连接引脚的处理方法等。
2.什么是单片机寄存器
寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个“8位元寄存器”或“32位元寄存器”。寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为“架构寄存器”。例如,x86指令集定义八个32位元寄存器的集合,但一个实作x86指令集的CPU可以包含比八个更多的寄存器。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
3.单片机寄存器的类型
3.1累加器A
累加器A是微处理器中使用最频繁的寄存器。在算术和逻辑运算时它有双功能:运算前,用于保存一个操作数;运算后,用于保存所得的和、差或逻辑运算结果。
3.2数据寄存器DR
数据寄存器通过数据总线向存储器和输入/输出设备送(写)或取(读)数据的暂存单元。它可以保存一条正在译码的指令,也可以保存正在送往存储器中存储的一个数据字节等等。
3.3指令寄存器IR和指令译码器ID
指令包括操作码和操作数。指令寄存器是用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存中取到数据寄存器中,然后再传送到指令寄存器。当系统执行给定的指令时,必须对操作码进行译码,以确定所要求的操作,指令译码器就是负责这项工作的。其中,指令寄存器中操作码字段的输出就是指令译码器的输入。
3.4程序计数器PC
PC用于确定下一条指令的地址,以保证程序能够连续地执行下去,因此通常又被称为指令地址计数器。在程序开始执行前必须将程序的第一条指令的内存单元地址(即程序的首地址)送入PC,使它总是指向下一条要执行指令的地址。
3.5地址寄存器AR
用来保存当前CPU所访问的内存单元的地址。由于在内存和CPU之间存在着操作速度上的差别,所以必须使用地址寄存器来保持地址信息,直到内存的读/写操作完成为止址寄存器(Address Register,AR)用来保存当前CPU所访问的内存单元的地址。由于在内存和CPU之间存在着操作速度上的差别,所以必须使用地址寄存器来保持地址信息,直到内存的读/写操作完成为止。数据寄存器DR用来暂存微处理器与存储器或输人/输出接口电路之间待传送的数据。地址寄存器AR和数据寄存器DR在微处理器的内部总线和外部总线之间,还起着隔离和缓冲的作用。
4.单片机寄存器的使用教程
要使用寄存器,需要写#include,然后就可以使用PORTA、DDRB、PINC等寄存器。它们是宏定义。不必探索它们是如何扩展的。只需要知道这些宏是可以读、赋值和位操作的,就像uint8_t类型变量一样。但是像PORTA0SumDDB7宏定义这样的东西并不代表寄存器上的位。它们实际上是字面常量,比如PORTAx寄存器表示寄存器PORTA的第x位(0为最低位,7为最高位),其值为X。因此,直接复制这些宏是不正确的(不仅意思不对,编译也不会通过)。
在开发板的库函数中提供包含多个位操作的宏函数。可以拿出存储器的手册来,看看后面是怎么实现的。
让我们举个例子,点亮一个LED,首先打开红色LED。原理图第2页左上角红色LED通过电阻与网络LED0相连,第1页LED0与单片机PC4引脚相连,所以我们需要让PC4脚输出高电平。回到三个寄存器的功能。输出高电平要求ddxn和portxn同时为1。我们把X和N分别用C和4取进去,也就是我们希望ddc4和portc4为1。
如果寄存器的一个位置为1,则set_bit实现。它需要两个参数,要操作的整数变量和表示第一个数字的整数。将ddc4设置为1应该写入set_bit(DDRC,4);4可以用DDC4替换,就是这样定义的。同理,portc4可以设置为1。点亮红色LED的整个过程如下:
接下来是存储器的数字输入。使用第一个按键相关的例子,保持LED状态与按键一致,即按下点亮。
要读取寄存器中的一位,可以使用read_bit。如果引脚上的电平为高电平,则read_bit的运算结果不为0(但不一定是布尔值1)。注意按键时引脚电平是低的,所以读取引脚电平的结果是你是否按下该键。
原理图中,key的一端接btn0网络,再接单片机的PA4引脚。所以按键是否按下应该写成:!read_bit(PINA,4)。
引脚应在读取前配置为输入。虽然是reset后默认输入的,在这个例子中没有必要给dda4写0,但是写清楚是一个好习惯,让看这段代码的人(可能是别人也可能是自己)明白PA4是输入。对于porta4,由于该引脚外接了上拉电阻,因此无需使能内部上拉电阻。
结合按键动作的知识,应该知道如何直接通过寄存器操作来判断按键动作。值得注意的是,这些程序都不需要在项目属性中将libee1库添加到链接器。虽然代码使用,但它们都是宏定义,独立于链接器。
5.关于单片机寄存器的常见问题
5.1什么是单片机寄存器?
简单地说,寄存器是一种内存。通常寄存器位于 CPU 或 MCU(微控制器)内,非常靠近算术单元或直接连接到各种 I/O 端口。由于这个位置或特殊设计,与其他类型的存储器相比,寄存器在读/写速度方面要快得多。
5.2单片机寄存器有什么作用?
寄存器的单片机(计算机)的存储单元,是存取数据较为方便、快速地方寄存器常用于存放使用比较频繁的数据,再参与运算,都很容易。
5.3哪些计算机使用单芯片处理器?
单芯片云计算机(SCC) 是英特尔实验室开发的一种实验性微处理器,SCC 微处理器包括集成在单个硅芯片上的 48 个内核,SCC 具有双核 SCC 磁贴、内存控制器和 24 路由器网状网络。
5.4什么是单芯片CPU?
大部分微机的ALU和控制单元都是在一块硅片上组合制造的。大多数现代 CPU 都是微处理器,这意味着它们包含在单个集成电路 (IC) 芯片中。
以上就是单片机的寄存器类型及操作教程的介绍了,单片机一种集成电路芯片,广泛用于各大行业中。单片机寄存器其实就相当于一个变量,只不过这个变量在固定的地址,有一个特殊的名称(当然也不强制)。初学者对寄存器的操作比较困难的原因不是汇编语言或C语言使用的不熟,而是对寄存器的陌生。单片机中存储器的资源是非常宝贵和有限的,任何产品都有使用说明书,要想最好的使用一款产品也是去阅读说明书。单片机或者芯片的说明书就是数据手册。数据手册中往往都是对寄存器如何操作的描述,只不过要耐下心来一点一点的去理解去消化手册所介绍的功能,这样才能用好。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !