单片机控制寄存器寄存器如何算读操作

从图中我们可以看出在51单片机控制寄存器内部有一个CPU用来运算、控制,有四个并行I/O口分别是P0、P1、P2、 P3,有ROM用来存放程序,有RAM用来存放中间结果,此外还有定时/计数器串行I/O口,中断系统以及一个内部的时钟电路。在一个51单片机控制寄存器 的内部包含了这么多的东西

对图进行进一步的分析,我们巳知对并行I/O口的读写只要将数据送入到相应I/O口的锁存器就可以了,那么对于定 时/计数器串行I/O口等怎么用呢?在单片机控制寄存器中有┅些独立的存储单元是用来控制这些器件的被称之为特殊功能寄存器(SFR)。事实上我们已接触过 P1这个特殊功能寄存器了,还有哪些呢看表1

定时器/计数器1(高8位)

定时器/计数器1(低8位)
定时器/计数器0(高8位)
定时器/计数器0(低8位)
定时器/计数器方式控制寄存器
定时器/计數器控制寄存器
数据地址指针(高8位)
数据地址指针(低8位)

下面,我们介绍一下几个常用的SFR

1、ACC---是累加器,通常用A表示

这是个什么东覀,可不能从名字上理解它是一个寄存器,而不是一个做加法的东西

为什么给它这么一个名字呢?或许是因为在运算器做运算时其中┅个数一定是在ACC中的缘故吧它的名字特殊,身份也特

殊稍后在中篇中我们将学到指令,可以发现所有的运算类指令都离不开它。自身带有全零标志Z若A=0则Z=1;若A≠0

则z=0。该标志常用作程序分枝转移的判断条件

2、B--一个寄存器。

在做乘、除法时放乘数或除数不做乘除法时,随你怎么用

3、PSW-----程序状态字。这是一个很重要的东西里面放了CPU工作时的很多状态,借此我们可以了解CPU的当前状态,并

作出相應的处理它的各位功能请看表2


下面我们逐一介绍各位的用途

CY:进位标志。 8051中的运算器是一种8位的运算器我们知道,8位运算器只能表示箌0-255如果做加法的话,两数相加可能会超过255这样最高位就会丢失,造成运算的错误怎么办?最高位就进到这里来这样就没事了。有進、借位CY=1;无进、借位,CY=0

AC:辅助进、借位(高半字节与低半字节间的进、借位)

F0:用户标志位, 由用户(编程人员)决定什么时候用什么时候不用。

RS1、RS0:工作寄存器组选择位 这个我们已知了。

0V:溢出标志位 运算结果按补码运算理解。有溢出OV=1;无溢出,OV=0什么昰溢出我们后面的章节会讲到。

P:奇偶校验位: 它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性若为奇数,则P=1否则为0。 运算结果有奇数个1P=1;运算结果有偶数个1,P=0

例:某运算结果是78H(),显然1的个数为偶数所以P=0。

4、DPTR(DPH、DPL)--------数据指针 可以用它来访问外部 數据存储器中的任一单元,如果不用也可以作为通用寄存器来用,由我们自已决定如何使用 分成DPL(低8位)和DPH(高8位)两个寄存器。用来存放16位哋址值以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范 围内的数据操作。

5、P0、P1、P2、P3 ------这个我们已经知道是四个并行輸入/输出口的寄存器。它里面的内容对应着管脚的输出

按位寻址,地址:A8H

EA (IE.7):EA=0时所有中断禁止(即不产生中断)

EA=1时,各中断的产生甴个别的允许位决定

ET2(IE.5):定时2溢出中断充许(8052用)

ES (IE.4):串行口中断充许(ES=1充许ES=0禁止)

ET1(IE.3):定时1中断充许

ET0(IE.1):定时器0中断充许

EX0(IE.0):外部中断INT0的中断允许

7、IP-----中断优先级控制寄存器

按位寻址,地址位B8H

PS (IP.4):串行口中断优先

PT1(IP.3):定时1中断优先

PT0(IP.1):定时器0中断优先

PX0(IP.0):外部中断INT0的中断优先

不按位寻址地址89H

GATE :定时操作开关控制位,当GATE=1时INT0或INT1引脚为高电平,同时TCON中的TR0或TR1控制位为1时计时/计数器0或1才开始工作。若GATE=0则只要将TR0或TR1控制位设为1,计时/计数器0或1就开始工作

C/T :定时器或计数器功能的选择位。C/T=1为计数器通过外部引脚T0或T1输入计数脈冲。C/T=0时为定时器由内部系统时钟提供计时工作脉冲。

M1 :模式选择位高位

M0 :模式选择位低位

8位自动加载计数/计时器
定时器1停止工作定時器0分为两个独立的8位定时器TH0及TL0

按位寻址,地址位88H

堆栈介绍:日常生活中我们都注意到过这样的现象,家里洗的碗一只一只摞起来,朂晚放上去的放在最上面而最早放 上去 的则放在最下面,在取的时候正好相反先从最上面取,这种现象我们用一句话来概括:“先进後出后进先出”。请大家想想还有什么地方有这种现象?其实比 比皆是建筑工地上堆放的砖头、材料,仓库里放的货物都是“先進后出,后进先出”这实际是一种存取物品的规则我们称之为“堆栈”。

在单片机控制寄存器中我们也可以在RAM中构造这样一个区域,鼡来存放数据这个区域存放数据的规则就是“先进后出,后进先 出”我们称之为“堆栈”。为什么需要这样来存放数据呢存储器本身不是可以按地址来存放数据吗?对知道了地址的确就可以知道里面的内容,但如果我们需 要存放的是一批数据每一个数据都需要知噵地址那不是麻烦吗?如果我们让数据一个接一个地放置那么我们只要知道第一个数据所在地址单元就可以了(看图 2)如果第一个数据茬27H,那么第二、三个就在28H、29H了所以利用堆栈这种方法来放数据可以简化操作
那么51中堆栈什么地方呢?单片机控制寄存器中能存放数据的區域有限我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方用于堆栈,但是用 内存的哪一块呢还是不好定,洇为51是一种通用的单片机控制寄存器各人的实际需求各不相同,有人需要多一些堆栈而有人则不需要那么多,所以怎么分配都不合适 怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者)根据自已的需要去定吧,所以51单片机控制寄存器中堆栈的位置是可以变化的而这种变化就体 现在SP中值的变化,看图2SP中的值等于27H不就相当于是一个指针指向27H单元吗?当然在真正的51机中开始指针所指的位置并非就是数据存放的 位置,而是数据存放的前一个位置比如一开始指针是指向27H单元的,那么第一个数据的位置是28H单元而不昰27H单元,为什么会这样我们在学堆栈 命令时再说明。


803l单片机控制寄存器共有21个字节的特殊功能寄存器(SFR)起着专用寄存器的作用,用来设置片内电路的运行方式记录电路 的运行状态,并表明有关标志等此外,特殊功能寄存器中还有把并行和串行I/O端口映射过来的寄存器,对这些寄存器的读写可实现从相应I/O端口的输 入、输出操作。

21个特殊功能寄存器不连续地分布在128个字节的SFR存储空间中地址空间为80H-FFH,见下图带*的表 明是有位地址的寄存器。在这片SFR空间中包含有128个位地址空间,地址也是80H-FFH但只有83个有效位地址,可对11个特殊功能寄存器的某 些位作位寻址操作

由此可见,在特殊功能寄存器中也有两套地址:字节地址和位地址。两者在地址空间上都是80H-FFH但对字节地 址呮有21个字节是有效的,对位地址只有83位是有效的可以说,它们是内部数据存储器中字节地址与位地址的不连续延伸其他无效地址单元昰不能被访问 的,在使用时应加以注意
21个特殊功能寄存器的名称及主要功用介绍如下,详细的用法在以下各节内容中予以介绍

IE、IP寄存器 莋用:中断控制用

TMOD、TCON 作用:计时、定时、计数器用

SCON寄存器 作用:串行传输控制

PCON寄存器 作用:省电模式操作

}

自从上一次完成小车工程后好玖都没有写博客了,因为这段时间都在忙着准备数学建模的比赛而且这个学期课业任务很重,几乎没有怎么去进阶自己的单片机控制寄存器水平总感觉自己被压的喘不过气来,没办法绩点不能不要哦好在终于盼来了五一假期,可以松一口气学习一下自己想学的东西叻。

经过一段时间的学习我的stm32也算是入门了,前段时间也自己做了一个智能小车的工程可我也知道只仅仅才是入门的水平。之前一直昰跟着正点原子的视频去学习库函数代码的编写虽然看起来已经可以完成那么多实验,其实我已经感觉到仅仅是库函数版本的学习并无法深入到单片机控制寄存器的实质无法去学习到芯片的架构。我的目标绝不仅仅是学习stm32,正如之前所说stm32仅仅是一种芯片如果不能理解芯爿的架构问题,一旦脱离了stm32就啥都干不了了可能简单的8051都能把自己搞得一头雾水。所以我决定这次五一假期老老实实呆在宿舍把之前莋的实验用寄存器重新做一遍,同时好好啃啃中文参考手册同时我决定把C语言重新学习一遍,C语言是嵌入式工程师的饭碗是最接近机器嘚语言然而我的C语言水平自觉真不咋地。上一次做蓝牙串口的时候字符和数都没搞清。所以无论目标多么远大都没什么软用我得把基础搞好,才能走的更远

然后就是关于未来的计划了。在进阶学习操作系统之前我决定先巩固一下基础搞好基本功。首先是硬件方面嘚学习焊板子是工程师的基本功,前段时间我练习了基本的电路焊接也焊废了不少东西对于一些大的焊盘已经基本可以搞定,但太小嘚贴片电阻焊盘还是力不从心所以还有更多的板子等着我去焊废。然后就是电路设计ALTIUMDISIGNER之前已经有过抄板的经历但自己还是做不来PCB设计。所以这个暑假我会加紧学习一下

给自己定一个小目标,在这个暑假结束前完成stm32和电路图设计的学习并且再完成一个掌上游戏机的工程(本来是想做无人机的后来想想一方面不确定因素太多,另一方面成本也高)

在暑假结束后大二,我估计自己已经可以进一步学习LINUX和咹卓了同时也具有参加ROBOCON和电子设计比赛的实力了。大学的学习我感觉终究还是得靠自己课堂上的知识终究还是理论层面的,想要比旁囚优秀自然要比旁人付出更多的努力

更进一步的计划也没必要再提了,说多了都是虚的先把技术搞好再谈其他的事。废话说完了现在鈳以聊正事了

关于寄存器的一点看法,首先关于寄存器与库函数其实我内心更偏向于使用库函数避免了查表,同时函数名即函数意义通俗易懂但寄存器一方面运行会更快,另一方面有助于加深对内部结构的理解所以代码依旧可以用库函数写,但是寄存器也要学这裏我对正点的寄存器开发指南进行精简,也方便今后自己的查找与使用

(二)STM32常用寄存器使用总结

1.时钟有关寄存器以及我对时钟的理解

時钟有HSE(高外),HSI(高内)PLL(对前两种做倍频),LSE(低外)LSI(低内)
SYSCLK(系统时钟),看门狗时钟RTC时钟
相应的GPIO端口寄存器必须被配置为相应功能。以下8个时钟信号可被选作MCO时钟:
●PLL3时钟(用于以太网)
在MCO上输出的时钟必须小于50MHz(这是I/O端口的最大速度)
时钟的选择由时钟配置寄存器(RCC_CFGR)中的MCO[3:0]位控制。

2.IO口有关寄存器及操作//查表见中文参考手册8.2

STM32的每个IO端口都有7个寄存器来控制他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2個32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用的
几个寄存器,我们常用嘚IO端口寄存器只有4个:CRL、CRH、IDR、ODR

该寄存器的复位值为0X,CRL低八位CRH高八位。复位值其实就是配置端口为浮空输入模式从上图还可以得出:STM32嘚CRL控制着每组IO端口(A~G)的低8位的模式。每个IO端口的位占用CRL的4个位高两位为CNF,低两位为MODE这里我们可以记住几个常用的配置,比如0X0表示模擬输入模式(ADC用)、0X3表示推挽输出模式(做输出口用50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的功能,50M速率)

IDR:输入数据寄存器
直接反应IO状态,读操作即可

ODR是一个端口输出数据寄存器,也只用了低16位该寄存器为可读写,从该寄存器读出来嘚数据可以用于判断当前IO口的输出状态而向该寄存器写数据,则可以控制某个IO口的输出电平

设置输出模式//CRL


2.串口有关寄存器及操作

APB2RSTR复位寄存器串口1的复位设置位在APB2RSTR的第14位。通过向该位写1复位串口1写0结束复位。

串口控制该寄存器的高18位没有用到低14位用于串口的功能设置。UE为串口使能位通过该位置1,以使能串口M为字长选择位,当该位为0的时候设置串口为8个字长外加n个停止位停止位的个数(n)是根据USART_CR2嘚[13:12]位设置来决定的,默认为0PCE为校验使能位,设置为0则禁止校验,否则使能校验PS为校验位选择,设置为0则为偶校验否则为奇校验。TXIE為发送缓冲区空中断使能位设置该位为1,当USART_SR中的TXE位为1时将产生串口中断。TCIE为发送完成中断使能位设置该位为1,当USART_SR中的TC位为1时将产苼串口中断。RXNEIE为接收缓冲区非空中断使能设置该位为1,当USART_SR中的ORE或者RXNE位为1时将产生串口中断。TE为发送使能位设置为1,将开启串口的发送功能RE为接收使能位,用法同TE
USART_DR数据发送与接收DR[8:0]为串口数据,包含了发送或接收的数据由于它是由两个寄存器组成的,一个给发送鼡(TDR)一个给接收用(RDR),该寄存器兼具读和写的功能TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口当使能校验位(USART_CR1中PCE位被置位)进行发送时,写到MSB的值(根据数据的长度不同MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时读到的MSB位是接收到的校验位。

RXNE(读数据寄存器非空)当该位被置1的时候,就是提示已经有数据被接收箌了并且可以读出来了。这时候我们要做的就是尽快去读取USART_DR通过读USART_DR可以将该位清零,也可以向该位写0直接清除。
TC(发送完成)当該位被置位的时候,表示USART_DR内的数据已经被发送完成了如果设置了这个位的中断,则会产生中断该位也有两种清零方式:1)读USART_SR,写USART_DR2)矗接向该位写0。


总结一下所进行的操作大致为:
2.IO口使能(串口IO设置为复用)
5. 串口基本属性CR设置,

1)初始化IO口为输入这一步设置你要作為外部中断输入的IO口的状态,可以设置为上拉/下拉输入也可以设置为浮空输入,但浮空的时候外部一定要带上拉或者下拉电阻。否则鈳能导致中断不停的触发在干扰较大的地方,就算使用了上拉/下拉也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带來的影响
2)开启IO口复用时钟,设置IO口与中断线的映射关系STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启複用时钟然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来
3)开启与该IO口相对的线上中断/事件,设置触发条件这┅步,我们要配置中断产生的条件STM32可以配置成上升沿触发,下降沿触发或者任意电平变化触发,但是不能配置成高电平触发和低电平觸发这里根据自己的实际情况来配置,同时要开启中断线上的中断这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话會引起软件仿真不能跳到中断,而硬件上是可以的而不设置EMR,软件仿真就可以进入中断服务函数并且硬件上也是可以的。建议不要配置EMR位
4)配置中断分组(NVIC),并使能中断
这一步,我们就是配置中断的分组以及使能,对STM32的中断来说只有配置了NVIC
的设置,并开启才能被执行否则是不会执行到中断服务函数里面去的。
5)编写中断服务函数
这是中断设置的最后一步,中断服务函数是必不可少的,洳果在代码里面开启了中断
但是没编写中断服务函数,就可能引起硬件错误从而导致程序崩溃!所以在开启了某个中断后,一定要记嘚为该中断编写服务函数在中断服务函数里面编写你要执行的中断后的操作。

这个太多了就不一一说了

5.定时器中断相关寄存器及操作

//僦是隔一段时间干一次事
我对定时器存在的是这样理解的:首先定时器的时钟一般设置来源APB1,而系统时钟又来源于外高默认一般为2倍频72M,一般只有定时器用这么高IO口最高50M。时钟存在的意义在于可以将系统的时钟资源合理有序的分配

STM32的通用定时器是一个通过可编程预分頻器(PSC)驱动的16位自动装载计数器(CNT)
构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整STM32的每个通用定时器都是完全独竝的,没有互相共享的任何资源
1)16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
2)16位可编程(可以实时修改)预分频器(TIMx_PSC)计数器时钟频率的分頻系数为1~
65535之间的任意数值。
3)4个独立通道(TIMx_CH1~4)这些通道可以用来作为:
C.PWM生成(边缘或中间对齐模式)
4)可使用外部信号(TIMx_ETR)控制定时器囷定时器互连(可以用1个定时器控制另外
一个定时器)的同步电路。
5)如下事件发生时产生中断/DMA:

A.更新:计数器向上溢出/向下溢出计數器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
E.支持针对定位的增量(正交)编码器囷霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理

预分频器寄存器(TIMx_PSC)对时钟源分频

控制寄存器1(TIMx_CR1)最低位来使能定时器

DMA/中断使能寄存器(TIMx_DIER)最低位用于使能更新中断 TIMx_CNT寄存器计数器存储了当前定时器的计数值

自动重装载寄存器(TIMx_ARR)

TIMx_SR寄存器,我们同样只用到了最低位当计数器CNT被重新初始化的时候,产生更新中断标记通过这个中断标志位,就可以知道产生中断的类型

1)TIM3时钟使能。
把APB1的分频设置為2了所以我们的TIM3时钟就是APB1时钟的2倍,等于系统时钟(72M)
通过这两个寄存器,我们来设置自动重装的值以及分频系数。这两个参数加仩时钟频率
就决定了定时器的溢出时间
因为我们要使用TIM3的更新中断,所以设置DIER的UIE位为1使能更新中断。
4)允许TIM3工作
光配置好定时器还鈈行,没有开启定时器照样不能用。我们在配置完后要开启定时器
5)TIM3中断分组设置。
在定时器配置完了之后因为要产生中断,必不鈳少的要设置NVIC相关寄存器以使能TIM3中断。


总结来说定时器中断可以为系统提供很多时间带当然也可以作为时间长短的获取,可以于输入捕获取得类似的效果
初始化步骤为时钟使能先设定装载值与预分频系数再使能更新中断与定时器最后设置中断

6.PWM输出操作及相关寄存器

捕獲/比较使能寄存器(TIMx_CCER)

在输出模式下,该寄存器的值与CNT的值比较根据比较结果产生相应动作。利用这点我们通过修改这个寄存器的值,就可以控制PWM的输出脉宽了本章,我们使用的是TIM3的通道2所以我们需要修改TIM3_CCR2以实现脉宽控制DS0的亮度。我们要使用TIM3的CH2输出PWM来控制DS0的亮度泹是TIM3_CH2默认是接在PA7上面的,而我们的DS0接在PB5上面如果普通MCU,可能就只能用飞线把PA7飞到PB5上来实现了不过,我们用的是STM32它比较高级,可以通過重映射功能把TIM3_CH2映射到PB5上。
所以运用不同通道的CCR就可以在相同定时器的情况下生成不同PWM波

1)开启TIM3时钟,配置PB5为复用输出
要使用TIM3,我們必须先开启TIM3的时钟(通过APB1ENR设置)这点相信大家看了这
么多代码,应该明白了这里我们还要配置PB5为复用输出,这是因为TIM3_CH2通道将重映射到PB5上此时,PB5属于复用功能输出
3)设置TIM3的的ARR和和PSC。在开启了TIM3的时钟之后我们要设置ARR和PSC两个寄存器的值来控制输出PWM的周期。当PWM周期太慢(低於50Hz)的时候我们就会明显感觉到闪烁了。因此PWM周期在这里不宜设置的太小。
接下来我们要设置TIM3_CH2为PWM模式(默认是冻结的),因为我们嘚DS0是低电
平亮而我们希望当CCR2的值小的时候,DS0就暗CCR2值大的时候,DS0就亮所以我们要通过配置TIM3_CCMR1的相关位来控制TIM3_CH2的模式。
在完成以上设置了の后我们需要开启TIM3的通道2输出以及TIM3。前者通过TIM3_CCER1来设置是单个通道的开关,而后者则通过TIM3_CR1来设置是整个TIM3的
总开关。只有设置了这两个寄存器这样我们才能在TIM3的通道2上看到PWM波输出。


总结来说初始化步骤为:
2.IO口配置(复用)
3.配置AFIO以重映射,
在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)戓’111’(PWM模式2)能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器最后还要设置TIMx_CR1寄存器的ARPE位,(在向上計数或中心对称模式中)使能自动重装载的预装载寄存器

当在输入捕获模式下使用的时候,对应图 15.1.2 的第二行描述从图中可以看出,TIMx_CCMR1 明显昰针对 2 个通道的配置低八位[7:0]用于捕获/比较通道 1 的控制,而高八位[15:8]则用于捕获/比较通道 2 的控制因为 TIMx 还有 CCMR2 这个寄存器,所以可以知道CCMR2 昰用来控制通道 3 和通道 4
1 )开启 TIM5 时钟配置 PA0 为下拉输入。要使用 TIM5我们必须先开启 TIM5 的时钟(通过 APB1ENR 设置)。这里我们还要配置 PA0
为下拉输入因为我們要捕获 TIM5_CH1 上面的高电平脉宽,而 TIM5_CH1 是连接在 PA0 上面的
在开启了 TIM5 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来设置输入捕获的自动重装载值和計数频率
TIM5_CCMR1 寄存器控制着输入捕获 1 和 2 的模式,包括映射关系滤波和分频等。这里我们需要设置通道 1 为输入模式且 IC1 映射到 TI1(通道 1)上面,并苴不使用滤波(提高响应速度)器
4)设置 TIM5 的 的 CCER ,开启输入捕获并设置为上升沿捕获。
TIM5_CCER 寄存器是定时器的开关,并且可以设置输入捕獲的边沿只有 TIM5_CCER
寄存器使能了输入捕获,我们的外部信号才能被 TIM5 捕获到,否则一切白搭同时要设置好捕获边沿,才能得到正确的结果
5 )设置 TIM5 的 的 DIER ,使能捕获和更新中断并编写中断服务函数
因为我们要捕获的是高电平信号的脉宽,所以第一次捕获是上升沿,第二次捕获时下降
沿必须在捕获上升沿之后,设置捕获边沿为下降沿同时,如果脉宽比较长那么定时器就
会溢出,对溢出必须做处理否則结果就不准了。这两件事我们都在中断里面做,所以必须开启捕获中断和更新中断设置了中断必须编写中断函数,否则可能导致死機我们需要在中断函数里面完成数据处理和捕获设置等关键操作,从而实现高电平脉宽统计


STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数
的计数器在相应软件配置下,可提供时钟日历的功能修改计数器的值可以重新设置系统当前的时间和日期。

RTC_CR 寄存器 设置了相应的允许位则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)
32 位的可编程计数器(RTC_CNT),可被初始化为当前的系统时间一个 32 位的时钟计數器,按秒钟计算可以记录 秒,约合 136 年左右作为一般应用,这已经是足够了的
2 个控制寄存器 RTC_CRH 和 RTC_CRL 该寄存器用来控制中断的,我们本章將要用到秒钟中断所以在该寄存器必须设置最低位为 1,以允许秒钟中断
RTC 预分频装载寄存器也有 2 个寄存器组成,RTC_PRLH 和RTC_PRLL这两个寄存器用来配置 RTC 时钟的分频数的,那么我们要设置这两个寄存器的值为 32767,以得到一秒钟的计数频率

1 )使能电源时钟和备份区域时钟
前面已经介绍了,峩们要访问 RTC 和备份区域就必须先使能电源时钟和备份区域时钟这
2 )取消备份区写保护。
要向备份区域写入数据就要先取消备份区域写保护(写保护在每次硬复位之后被使能),
否则是无法向备份区域写入数据的我们需要用到向备份区域写入一个字节,来标记时钟已经配置过了这样避免每次复位之后重新配置时钟。
3 )复位备份区域开启外部低速振荡器。
在取消备份区域写保护之后我们可以先对这個区域复位,以清除前面的设置当然这个
操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失所以要不要复位,要看情况而定然后我们使能外部低速振荡器,注意这里一般要先判断 RCC_BDCR 的 LSERDY位来确定低速振荡器已经就绪了才开始下面的操作
4 )选择 RTC 时钟,並使能
5 )设置 RTC 的分频,以及配置 RTC 时钟
在开启了 RTC 时钟之后,我们要做的就是设置 RTC 时钟的分频数通过 RTC_PRLH 和
RTC_PRLL 来设置,然后等待 RTC 寄存器操作完荿并同步之后,设置秒钟中断然后设置
6 )更新配置,设置 RTC 中断
在设置完时钟之后,我们将配置更新这里还是通过 RTC_CRH 的 CNF 来实现。在这の后
我们在备份区域 BKP_DR1 中写入 0X5050 代表我们已经初始化过时钟了下次开机(或复位)的时候,先读取 BKP_DR1 的值然后判断是否是 0X5050 来决定是不是要配置,避免重复配置接着我们配置 RTC 的秒钟中断,并进行分组
7 )编写中断服务函数。
最后我们要编写中断服务函数,在秒钟中断/闹钟中斷产生的时候读取当前的时间值,

ADC_CR1 的 SCAN 位该位用于设置扫描模式,由软件设置和清除如果设置为 1,则
使用扫描模式如果为 0,则关闭掃描模式在扫描模式下,由 ADC_SQRx 或 ADC_JSQRx 寄
存器选中的通道被转换如果设置了 EOCIE 或 JEOCIE,只在最后一个通道转换完毕后才会产生 EOC 或 JEOC 中断ADC_CR1[19:16]用于设置 ADC 的操作模式
ADC_CR2,该寄存器我们也只针对性的介绍一些位:ADON 位用于开关 AD 转换器而 CONT 位用于设置是否进行连续转换,我们使用单次转换所以 CONT 位必須为 0。CAL 和 RSTCAL 用于AD 校准ALIGN 用于设置数据对齐,我们使用右对齐该位设置为 0。EXTSEL[2:0]用于选择启动规则转换组转换的外部事件
ADC 规则序列寄存器(ADC_SQR1~3)L[3:0]用于存储规则序列的长度我们这里只用了 1 个,所以设置这几个位的值为 0其他的 SQ13~16 则存储了规则序列中第 13~16 个通道的编号(0~17)。另外两个規则序列寄存器同 ADC_SQR1 大同小异我们这里就不再介绍了,要说明一点的是:我们选择的是单次转换所以只有一个通道在规则序列里面,这個序列就是 SQ1通过 ADC 规则数据寄存器(ADC_DR)规则序列中的 AD 转化结果都将被存在这个寄存器里面

1 )开启 PA 口时钟,设置 PA1 为模拟输入
2 )使能 ADC1 时钟,并设置分频因子
要使用 ADC1,第一步就是要使能 ADC1 的时钟在使能完时钟之后,进行一次 ADC1 的
复位接着我们就可以通过 RCC_CFGR 设置 ADC1 的分频因子。分频因子偠确保 ADC1 的时钟(ADCCLK)不要超过 14Mhz
3 )设置 ADC1 的工作模式。
在设置完分频因子之后我们就可以开始 ADC1 的模式配置了,设置单次转换模式、触发
方式選择、数据对齐方式等都在这一步实现
4 )设置 ADC1 规则序列的相关信息。
接下来我们要设置规则序列的相关信息我们这里只有一个通道,並且是单次转换的所
以设置规则序列中通道数为 1,然后设置通道 1 的采样周期
5 )开启 AD 转换器,并校准在设置完了以上信息后,我们就開启 AD 转换器执行复位校准和 AD 校准,注意这两步是必须的!不校准将导致结果很不准确
在上面的校准完成之后,ADC 就算准备好了接下来峩们要做的就是设置规则序列 1 里面
的通道,然后启动 ADC 转换在转换结束后,读取 ADC1_DR 里面的值就是了
3.3V。如果大家想自己设置其他参考电压將你的参考电压接在 Vref+上就 OK了。本章我们的参考电压设置的是 3.3V
通过以上几个步骤的设置,我们就能正常的使用 STM32F1 的 ADC1 来执行 AD 转换了


总结来说峩们需要做的配置是

  1. ADC时钟使能复位结束复位,

  2. 规则序列配置SQRCR2开启校准,

  3. 通过CR2开启转换读DR值。

    好了有关STM32的基础大概就是这些将之前学嘚东西再学一遍后,已经对内部的寄存器有了清晰的认识相比于之前用库函数迷迷糊糊的写代码发现自己对其理解又更深一层,所以辛苦是没有白费的
    此外学习寄存器的过程明显比一开始的学习快很多,在了解了大致的原理过程后我需要完成的仅仅是从参考手册中找到對应的寄存器位以及设置方法还有就是我发现寄存器的代码编写非常简洁不容易出错,而且可以在出BUG时非常容易找出错误所在只要去觀察寄存器状态在哪里出错,一次就可以找出错误所在避免了一遍一遍的用串口刷机找错。
    下面还有很多更高级的实验就不再多说了,常用的寄存器大概就是这些我接下来就准备用寄存器的编写方式去解决一下此前没有解决的小车测速部分的问题。

}

  51单片机控制寄存器是对所有兼容Intel 8031指令系统的单片机控制寄存器的统称该系列单片机控制寄存器的始祖是Intel的8004单片机控制寄存器,后来随着Flash rom技术的发展8004单片机控制寄存器取得了长足的进展,成为应用最广泛的8位单片机控制寄存器之一其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场51单片机控制寄存器是基础入门的一个单片机控制寄存器,还是应鼡最广泛的一种需要注意的是51系列的单片机控制寄存器一般不具备自编程能力。本文主要详细介绍51单片机控制寄存器寄存器功能首先介绍了51单片机控制寄存器引脚图及功能,其次阐述了51单片机控制寄存器寄存器功能具体的跟随小编来了解一下。

  51单片机控制寄存器引脚图及功能

  ALE:地址锁存控制信号在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来以实现低位地址和数据的隔离。此外甴于ALE是以晶振1/6的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲使用

  PSEN:外部程序存储器读选通信号。在读外部ROM时PSEN有效(低电平),以实现外部ROM单元的读操作

  EA:访问程序存储控制信号。当信号为低电平时对ROM的读操作限定在外部程序存储器;当信号為高电平时,对ROM的读操作是从内部程序存储器开始并可延至外部程序存储器。

  RST:复位信号当输入的复位信号延续两个机器周期以仩的高电平时即为有效,用以完成单片机控制寄存器的复位初始化操作

  XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时此二引线端鼡于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号

  以上是MCS-51单片机控制寄存器芯片40条引脚的定义及简单功能說明,读者可以对照实训电路找到相应引脚在电路中查看每个引脚的连接使用。P3口线的第二功能P3的8条口线都定义有第二功能。

  51单爿机控制寄存器寄存器功能一览表

  21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中地址空间为80H-FFH,在这片SFR空间中包含有128个位地址空间,地址也是80H-FFH但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)

  在51单片机控制寄存器内部有一个CPU用来运算、控制,有四个并行I/O口分别是P0、P1、P2、P3,有ROM用来存放程序,有RAM用来存放中间结果,此外还有定时/计数器串行I/O口,中断系统以及一个内部的时钟电路。在单片机控制寄存器中有一些独立的存储单え是用来控制这些器件的被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机控制寄存器共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):

  1、ACC---是累加器通常用A表示

  这是个什么东西,可不能从名字上理解它是一个寄存器,而不是一个做加法的东西为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧它的名字特殊,身份也特殊稍后在中篇中我们将学到指令,可以发现所有的运算类指令都离不开它。自身带有全零标志Z若A=0则Z=1;若A≠0则z=0。該标志常用作程序分枝转移的判断条件

  2、B--一个寄存器

  在做乘、除法时放乘数或除数,不做乘除法时随你怎么用。

  这是一個很重要的东西里面放了CPU工作时的很多状态,借此我们可以了解CPU的当前状态,并作出相应的处理它的各位功能请看下表:

  下面峩们逐一介绍各位的用途

  8051中的运算器是一种8位的运算器,我们知道8位运算器只能表示到0-255,如果做加法的话两数相加可能会超过255,這样最高位就会丢失造成运算的错误,怎么办最高位就进到这里来。这样就没事了有进、借位,CY=1;无进、借位CY=0

  AC:辅助进、借位(高半字节与低半字节间的进、借位)。

  由用户(编程人员)决定什么时候用什么时候不用。

  RS1、RS0:工作寄存器组选择位

  通过修改PSW中的RS1、RS0两位的状态就能任选一个工作寄存器区。这个特点提高了MCS-51现场保护和现场恢复的速度对于提高CPU的工作效率和响应Φ断的速度是很有利的。若在一个实际的应用系统中不需要四组工作寄存器,那么这个区域中多余单元可以作为一般的数据缓冲器使用

  运算结果按补码运算理解。有溢出OV=1;无溢出,OV=0什么是溢出我们后面的章节会讲到。

  它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性若为奇数,则P=1否则为0。运算结果有奇数个1P=1;运算结果有偶数个1,P=0

  例:某运算结果是78H(),显然1的个数為偶数所以P=0。

  可以用它来访问外部数据存储器中的任一单元如果不用,也可以作为通用寄存器来用由我们自已决定如何使用。汾成DPL(低8位)和DPH(高8位)两个寄存器用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数據操作

  这个我们已经知道,是四个并行输入/输出口(I/O)的寄存器它里面的内容对应着管脚的输出。

  6、IE-----中断充许寄存器

  可按位寻址地址:A8H

  EA (IE.7):EA=0时,所有中断禁止(即不产生中断);EA=1时各中断的产生由个别的允许位决定

  - (IE.6):保留

  ET2(IE.5):定時2溢出中断充许(8052用)

  ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止)

  ET1(IE.3):定时1中断充许

  EX1(IE.2):外中断INT1中断充许

  ET0(IE.1):定时器0Φ断充许

  EX0(IE.0):外部中断INT0的中断允许

  7、IP-----中断优先级控制寄存器

  可按位寻址地址位B8H

  - (IP.7):保留

  - (IP.6):保留

  PT2(IP.5):定时2中断优先(8052用)

  PS (IP.4):串行口中断优先

  PT1(IP.3):定时1中断优先

  PX1(IP.2):外中断INT1中断优先

  PT0(IP.1):定时器0中断优先

  PX0(IP.0):外部中断INT0的中断优先

  8、TMOD-----定时器控制寄存器

  不按位寻址,地址89H

  GATE :定时操作开关控制位当GATE=1时,INT0或INT1引脚为高电平同时TCON中的TR0戓TR1控制位为1时,计时/计数器0或1才开始工作若GATE=0,则只要将TR0或TR1控制位设为1计时/计数器0或1就开始工作。

  C/T :定时器或计数器功能的选择位C/T=1为计数器,通过外部引脚T0或T1输入计数脉冲C/T=0时为定时器,由内部系统时钟提供计时工作脉冲

  M1 、M0:T0、T1工作模式选择位

  9、TCON-----定时器控制寄存器

  可按位寻址,地址位88H

  TF1:定时器T1溢出标志可由程序查询和清零,TF1也是中断请求源当CPU响应T1中断时由硬件清零。

  TF0:萣时器T0溢出标志可由程序查询和清零,TF0也是中断请求源当CPU响应T0中断时由硬件清零。

  TR1:T1充许计数控制位为1时充许T1计数。

  TR0:T0充許计数控制位为1时充许T0计数。

  IE1:外部中断1请示源(INT1P3.3)标志。IE1=1外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1(边沿觸发方式)

  IT1:外部中断源1触发方式控制位。IT1=0外部中断1程控为电平触发方式,当INT1(P3.3)输入低电平时置位IE1。

  IE0:外部中断0请示源(INT0P3.2)标志。IE0=1外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”IE0(边沿触发方式)

  IT0:外部中断源0触发方式控制位。IT0=0外部中断1程控为电平触发方式,当INT0(P3.2)输入低电平时置位IE0。

  10、SCON----串行通信控制寄存器

  它是一个可寻址的专用寄存器用于串行數据的通信控制,单元地址是98H其结构格式如下:

  (1)SM0、SM1:串行口工作方式控制位。

  00 方式0-波特率由振荡器频率所定:振荡器频率/12

  01 方式1-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32

  10 方式2-波特率由振荡器频率和SMOD所定:2SMOD ×振荡器频率/64

  11 方式3-波特率甴定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32

  (2)SM2:多机通信控制位《 br》 多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3接收状态,当串行口工作于方式2或3以及SM2=1时,只有当接收到第9位数据(RB8)为1时才把接收到的前8位数据送入SBUF,且置位RI发出中断申请否则会將接受到的数据放弃。当SM2=0时就不管第位数据是0还是1,都难得数据送入SBUF并发出中断申请。

  工作于方式0时SM2必须为0。

  (3)REN:允许接收位《 br》 REN用于控制数据接收的允许和禁止,REN=1时允许接收,REN=0时禁止接收。

  (4)TB8:发送接收数据位8《 br》 在方式2和方式3中,TB8是要發送的——即第9位数据位在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据TB8=0为数据,TB8=1时为地址

  (5)RB8:接收数據位8。

  在方式2和方式3中RB8存放接收到的第9位数据,用以识别接收到的数据特征

  (6)TI:发送中断标志位。

  可寻址标志位方式0时,发送完第8位数据后由硬件置位,其它方式下在发送或停止位之前由硬件置位,因此TI=1表示帧发送结束,TI可由软件清“0”

  (7)RI:接收中断标志位。

  可寻址标志位接收完第8位数据后,该位由硬件置位在其他工作方式下,该位由硬件置位RI=1表示帧接收完荿。

  PCON主要是为CHMOS型单片机控制寄存器的电源控制而设置的专用寄存器单元地址是87H,其结构格式如下:

  在CHMOS型单片机控制寄存器中除SMOD位外,其他位均为虚设的SMOD是串行口波特率倍增位,当SMOD=1时串行口波特率加倍。系统复位默认为SMOD=0

  TF2:T2溢出中断标志。TF2必须由用户程序清“0”当T2作为串口波特率发生器时,TF2不会被置“1”

  EXF2:定时器T2外部中断标志。EXEN2为1时当T2EX(P1.1)发生负跳变时置1中断标志DXF2,EXF2必须由用戶程序清“0”

  TCLK:串行接口的发送时钟选择标志。TCLK=1时T2工作于波特率发生器方式。

  RCLK:串行接口的接收时钟选择标志位RCLK=1时,T2工莋于波特率发生器方式

  EXEN2:T2的外部中断充许标志。

  C/T2:外部计数器/定时器选择位C/T2=1时,T2为外部事件计数器计数脉冲来自T2(P1.0);C/T2=0时,T2为定时器振荡脉冲的十二分频信号作为计数信号。

  TR2:T2计数/定时控制位TR1为1时充许计数,为0时禁止计数

  CP/RL2:捕捉和常数自动再裝入方式选择位。为1时工作于捕捉方式为0时T2工作于常数自动再装入方式。当TCLK或RCLK为1时CP/RL2被忽略,T2总是工作于常数自动再装入方式

  下媔对T2CON的D0、D2、D4、D5几位主要控制T2的工作方式,下面对这几位的组合关系进行总结

  MCS-51与中断有关的寄存器、中断入口地址及编号

  1、中断入ロ地址及编号

  MCS-51在每一个机器周期顺序检查每一个中断源在机器周期的S6按优先级处理所有被激活的中断请求,此时如果CPU没有正在处悝更高或相同优先级的中断,或者现在的机器周期不是所执行指令的最后一个机器周期或者CPU不是正在执行RETI指令或访问IE和IP的指令(因为按MCS-51Φ断系统的特性规定,在执行完这些指令之后还要在继续执行一条指令,才会响应中断)CPU在下一个机器周期响应激活了的最高级中断請求。

  中断响应的主要内容就是由硬件自动生成一条长调用LCALL addr16指令这里的addr16就是程序存储器中相应的中断区入口地址,这些中断源的服務程序入口地址如下:

  生成LCALL指令后CPU紧跟着便执行之。首先将PC(程序计数器)的内容压入堆栈保护断点然后把中断入口地址赋予PC,CPU便按新的PC地址(即中断服务程序入口地址)执行程序

  值得一提的是,各中断区只有8个单元一般情况下(除非中断程序非常简单),都不可能安装下一个完整的中断服务程序因此,通常是在这些入口地址区放置一条无条件转移指令使程序按转移的实际地址去执行嫃正的中断服务程序。

  对于汇编中断函数的一般形式为:

  对于C语言,中断函数的一般形式为:

  2、与中断有关的寄存器

  (1) 定时器控制寄存器TCON

  IE1:外部边沿触发中断1请求标志其功能和操作类似于TF0。

  IT1:外部中断1类型控制位通过软件设置或清除,用於控制外中断的触发信号类型IT1=1,边沿触发IT=0是电平触发。

  IE0:外部边沿触发中断0请求标志其功能和操作类似于IE1。

  IT0:外部中断0类型控制位通过软件设置或清除,用于控制外中断的触发信号类型其功能和操作类似于IE1。

  (2) 中断允许寄存器IE

  EA:中断总控制位EA=1,CPU开放中断EA=0,CPU禁止所有中断

  ES:串行口中断控制位,ES=1允许串行口中断ES=0,屏蔽串行口中断

  ET1:定时/计数器T1中断控制位。ET1=1允許T1中断,ET1=0禁止T1中断。

  EX1:外中断1中断控制位EX1=1,允许外中断1中断EX1=0,禁止外中断1中断

  ET0:定时/计数器T0中断控制位。ET1=1允许T0中断,ET1=0禁止T0中断。

  EX0:外中断0中断控制位EX1=1,允许外中断0中断EX1=0,禁止外中断0中断

  (3) 中断优选级控制寄存器IP

  PS:串行口中断口优先级控制位,PS=1串行口中断声明为高优先级中断,PS=0串行口定义为低优先级中断。

  PT1:定时器1优先级控制位PT1=1,声明定时器1为高优先级Φ断PT1=0定义定时器1为低优先级中断。

  PX1:外中断1优先级控制位PT1=1,声明外中断1为高优先级中断PX1=0定义外中断1为低优先级中断。

  PT0:定時器0优先级控制位PT1=1,声明定时器0为高优先级中断PT1=0定义定时器0为低优先级中断。

  PX0:外中断0优先级控制位PT1=1,声明外中断0为高优先级Φ断PX1=0定义外中断0为低优先级中断。

  (4)串行通信控制寄存器SCON

  它是一个可寻址的专用寄存器用于串行数据的通信控制,单元地址是98H其结构格式如下:

  TI:发送中断标志位。

  方式0时发送完第8位数据后,由硬件置位其它方式下,在发送或停止位之前由硬件置位因此,TI=1表示帧发送结束TI可由软件清“0”。

  RI:接收中断标志位

  接收完第8位数据后,该位由硬件置位在其他工作方式丅,该位由硬件置位RI=1表示帧接收完成。

  (5)T2状态控制寄存器T2CON

  TF2:T2溢出中断标志TF2必须由用户程序清“0”。当T2作为串口波特率发生器时TF2不会被置“1”。

  EXF2:定时器T2外部中断标志EXEN2为1时,当T2EX(P1.1)发生负跳变时置1中断标志DXF2EXF2必须由用户程序清“0”。

  EXEN2:T2的外部中断充许标志

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载文章观点仅代表作者本人,不代表电子发烧友网立场文章忣其配图仅供工程师学习之用,如有内容图片侵权或者其他问题请联系本站作侵删。 

}

我要回帖

更多关于 单片机控制寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信