第二章 单片机的硬件
本章部分内容涉及的寻址、中断等内容,将在后续章节介绍。
2.1 硬件组成
- 8位CPU,包含运算器和控制器两大部分。
- 数据储存器(256B RAM),但在片外可以外扩,最多可以多外扩64 KB。
- 程序存储器(8KB Flash ROM),片外也可以外扩,但片外最多外扩至64 KB。即“片内+片外”的ROM不超过64 KB。
- 4个8位并行I/O口
- 3个可编程的16位定时器/计数器
- 6个中断源,6个中断向量(中断服务子程序入口地址),两级中断优先权。
- SFR。共有32个SFR,用于CPU对片内各外设部件进行管理、控制和监视。SFR映射在片内的RAM(地址为80H-FFH)。
- 一个Watch Dog Timer
- 有在低功耗下工作的节电的空闲模式(Idle Mode)和掉电模式(Power Down Mode)
各个部件通过单片机片内的单一总线连接而成。CPU对片内各种外设部件的控制,是利用特殊功能寄存器(SFR)进行集中控制的。
2.2 引脚功能
主要为40引脚的DIP(double in-line package)封装。
PLCC(plastic leaded chip carrier)封装和TQFP(thin quad flat package)封装不常见。
DIP封装方式的单片机有40个引脚。
这40个引脚可以分为三类
- 电源及时钟引脚(注:XTAL 就是crystal 晶体)
- 控制引脚
- I/O 引脚 4×8 = 32 个
选取一些较为具体地讲一下
- XTAL1是片内时钟振荡器的反相放大器的输入端。若单片机使用片内时钟,该引脚接石英晶体和微调电容。若使用外部时钟时,该引脚接外部时钟振荡器的输出。
- XTAL2是片内时钟振荡器的反相放大器的输出端。若单片机使用片内时钟时,该引脚同样接石英晶体和微调电容。若使用外部时钟,则该引脚悬空。
- RST为复位信号输入端,上面没杠代表高电平有效。具体地说,如果给该引脚加超过两个机器周期(24个时钟周期)的高电平,则单片机复位。单片机正常工作时,这个引脚的输入应为 ≤ 0.5 V的低电平。看门狗让单片机复位的原理,就是当看门狗的定时器溢出时,看门狗定时器会向RST引脚输出一个长达8个机器周期的高电平,所以单片机就会复位。
- 引脚意为地址使能(Enable Address)。这里的地址就是外部程序存储器(ROM)的地址空间,当 的输入为高电平时,单片机先读片内ROM中的代码,再读片外ROM中存放的代码。当 输入为低电平时,就只读取外部ROM中存储的代码。
- ALE意为地址锁存使能(Address Latch Enable)。它的存在,是因为单片机的引脚数目有限,因此P0口是作为低8位地址总线和8位数据总线分时复用的。当单片机要和外界进行数据交流时(单片机要访问外部ROM/RAM),这时候P0口就要变成8位数据总线,在变成数据总线之前,ALE会进行一次负跳变,将P0口先发出的低8位地址锁存到P0口外接的地址锁存器中,完成这一操作后,P0口才能够放心大胆地去当它的数据总线。这也是地址锁存使能名字的由来。
- (Program Strobe ENable)。Strobe意为闸门,因此这个引脚的作用就是当单片机访问片外ROM读取指令码时,这个引脚在每个机器周期会产生两次有效信号(低电平信号)。
2.3 CPU
单片机的CPU由运算器和控制器组成
2.3.1 运算器
运算器用于对操作数进行算术、逻辑和位操作。运算器主要包括
算术逻辑运算单元(Arithmetic Logical Unit, ALU)。ALU可以对8位(单字节)的变量进行逻辑和算术运算,也可以对位变量进行逻辑运算和set、reset、complete等运算。
-
累加器A。CPU中使用最频繁的8位寄存器,为32个SFR之一。作用:
- 作为ALU的输入之一,也是ALU输出结果的存放地。
- 数据传送的中转站。但由于累加器只有一个,如果大家都要用累加器中转就会堵车,所以单片机增加了一部分数据传送指令,这使得某些数据的传送可以不经过累加器。累加器有一个进位位Cy(位于PSW中),这个Cy同时也是位处理器的(位)累加器
-
程度状态字寄存器(Program Status Word, PSW)。顾名思义,这是一个8位寄存器,而且每个位都包含了程序运行状态的不同信息。堪称是单片机的体检报告单。PSW的从高到低依次为
- Cy 进位标志位。
- Ac 辅助进位标志位。
- F0 用户使用的标志位。
- RS1 RS0 工作寄存器选择控制位。
- OV 溢出标志位。
- PSW.1 保留位,无用
- P 奇偶校验位。用以表示累加器A中 1 的个数。P =1 代表A中 1 的个数为奇数。
2.3.2 控制器
CPU的控制器是识别指令,并根据指令性质控制片内各部件,具体而言,就是对控制指令(程序)进行读入、译码和执行。控制器包含:
- 程序计数器(Program Counter, PC)。PC是一个独立的16位计数器,用户没办法直接访问PC(读/写)。当单片机复位时,PC的值会变成 0000H。PC的值实际上是某个程序(指令)的地址,因此PC就是程序存储器(ROM)的地址指针,也就是程序指针。程序指针和程序计数器是从不同的方面描述同一个事物(PC),它们指的是同一个东西。PC的工作过程是这样的:当CPU想要读取某条指令时,CPU会将PC的值——也就是指令的地址——告知程序存储器(ROM),然后程序存储器就会把这个地址上的指令找出来供CPU读取,CPU读取指令后,PC自加——这也是为什么PC名字的由来。最最最重要的一点:PC的计数宽度(16 位),决定了单片机能够访问的ROM的范围( B = 64 KB),因此程序存储器最多只能有64 KB。
2.4 存储器(最难)
单片机的存储器空间可以划分成四类
2.4.1 程序存储器(ROM) 重要
单片机之所以可以按敌营的次序工作,就是因为ROM中存放了调试正确的程序。单片机的地址总线有16位,这意味着有共 B = 64 KB的空间可供程序指令居住。片内ROM是8 KB的Flash存储器,地址范围为0000H-1FFFH。片外可最大外扩64 KB的ROM,地址范围为0000H-FFFFH。在这里,我们会看到片内和片外ROM有一部分地址(门牌号)是相同的,但是!由于对片内ROM和片外ROM的寻址方式是不同的,所以即使门牌号相同也不会引起误解,系统根据指令,会知道到底是访问片内的0000H还是片外的0000H。
在ROM的使用中,需要注意两个问题:
CPIU究竟是访问片内还是片外ROM,是由引脚决定的。 当 = 0 时,片内的ROM是没人管的 即使里面储存有程序代码也没用。
-
程序存储器(ROM)中的一个单元对应一个字节,可以存放一条单字节指令。程序存储器的某些单元是给中断服务子程序留的,这些位专门作为中断服务子程序的入口地址
如上表所示,一共有6个单元是留给中断服务子程序做入口地址的。但大家也可以看,这些入口之间彼此的空间是很狭窄的,仅有8个单元,如果我们要写中断服务子程序,一般来讲肯定是写不下的,除非你的中断服务程序就一两条指令,而与此同时,ROM可是有着64 KB()的空间,还有广阔天地可以用于储存程序。因此,通常的做法是在这些入口存放一条跳转指令,并在相应的地方再写上完整的中断服务子程序。这样,当中断触发时,CPU的PC值等于中断服务子程序入口地址时,PC就会根据相应的指令跳向那个储存着完整中断子程序的地方(那个地方才能真正称为中断服务子程序的入口地址,前述那个倒不如说是个藏宝图)。而且,由于单片机复位后PC的值变成0000H,我们可以看到,0000H和外部中断0的入口地址0003H之间仅仅隔着三个单元,这么狭窄的空间,主程序怎么可能写的下呢?但三个单元的空间放个跳转指令还是可以的,所以一般在0000H单元存放一条跳转指令,单片机一复位,CPU一读取这个跳转指令,就跳向主程序的入口地址。
2.4.2 数据存储器(RAM) 重要
单片机的片内RAM共有256B(256个字节),字节地址为00H-FFH如上图,这个就是单片机内部RAM的结构,但是高128 B的RAM和SFR的地址时一样的,如果发生要找高128 B的 RAM ,却误打误撞跑去找了SFR,这可怎么办呢?这当然是不可能的。。。它们的指令寻址方式是不同的,CPU会自己判断这个80H是RAM的还是SFR的。对于高128 B (80H-FFH)的 RAM,只能通过间接寻址(@),而对于相同地址的SFR,只能通过直接寻址,对于低128 B的RAM,既可以直接寻址也可以间接寻址。
同时我们会看到20H-2FH是位寻址去,这表明这个区域既可以位寻址也可以字节寻址。而30H-7FH的 RAM只能字节寻址。
如果使用了片外的RAM,我们会发现片外的低256 B的地址和片内这边的低256 B的地址肯定是一样的,但还是一样,我们会使用不同的汇编语言指令寻址方式来访问这两块数据区,CPU会自己判断某个00H究竟是片内RAM的还是片外RAM的。
2.4.3 SFR (重要)
SFR的单元地址在片内RAM的80H-FFH中(前述,片内RAM有两个80H-FFH),前面提到SFR只有32个,而片内RAM的80H-FFH是有128个字节的,所以SFR的32个地址是离散地分布在这个区域的。
千万要注意,片内 RAM的80H-FFH,里面是SFR的地址,不是SFR!!SFR的值不在那里。
这里主要介绍的SFR有
-
堆栈指针(Stack Pointer, SP)。堆栈指针,顾名思义,SP里面存放的值就是堆栈的地址。堆栈在片内的RAM中,而SP的值则是堆栈顶部在片内RAM的位置。它的值可以值00H-FFH的任意一个值。堆栈要注意两个词——向上生长和先进后出。单片机复位后,SP的值为07H,由于向上生长,当第一个字节被压入堆栈时,SP的值会变成08H,也就是说堆栈实际上是从08H开始的。而我们可以看到,片内 RAM的08H-1FH是工作寄存器的地盘,堆栈设在要在用户RAM区会好一点,因此通常的操作是,在单片机复位后,先把SP的值从07H改成60H或者其他大于30H的值,以避免进入别人的地盘。
这里在强调一下堆栈的作用,堆栈是为了调用子程序和有关中断的操作而设立的,它的功能是
- 保护断电。无论是子程序调用还是中断服务子程序的调用,主程序的进行都会被“打断”。但是等子程序执行完毕后,主程序还得从原来的地方继续它的生活,因此要把主程序的断点地址(你已经想到了,是PC的值)压到堆栈(PC是16位,所以要压两个字节到堆栈)。为主程序之后做回原来的自己做准备。
- 保护现场。单片机在“打断”主程序后,要执行子程序。而子程序的执行,很可能要用到单片机中的一些寄存器,而寄存器原有的内容,我们可能并不想被子程序修改。于是在执行子程序之前,有必要把这些寄存器现有的值保护起来,也压到堆栈里。当前时刻这些寄存器的值的集合,反映了这个时刻单片机的状态,形象点来理解,就有点类似于“犯罪现场”的意思,因此我们在利用子程序之前,有必要保护“现场”不受破坏。
寄存器B。乘除用,好理解。
AUXR(AUXILIARY) 辅助寄存器。ALE和看门狗相关,好理解。
数据指针(DPTR0/1),便于访问RAM,不作为重点。AUXR1辅助寄存器(也是一个SFR)和数据指针相关
看门狗(Watch Dog Timer, WDT)。单片机世界秩序的守护者。包含一个14位的计数器和看门狗复位寄存器(WDTRST)
2.4.4 位地址空间
位地址空间共有两部分,分别位于片内RAM和SFR区域中。
位地址和字节地址不同,一个字节地址代表的一个单元大小是一个字节。而一个位地址代表的一个单元,大小是一个位。举个例子,位地址的范围为00H-FFH,有219个(有些位地址无效),其中位地址 80H代表的是P0的最低位,也就是说P0最低位的位地址是80H。而位地址00H代表的是片内 RAM中20H这个单元的最低位。位地址00H-07H分别代表了片内RAM 的20H单元的最低位到最高位。
2.5 I/O 口
内容较少,比较重要的点,比如
- P0口可以作用通用的I/O口,此时需要在各引脚的片外接上拉电阻。同时P0口也作为8位数据总线和低8位地址总线分时复用。大多数情况下,单片机都要扩展 RAM或者I/O 芯片接口,所以P0一般不作为通用I/O 口。
- P1只能当通用I/O 口。
- P2 可作为高8位地址总线,也可作通用I/O口 。但一般情况下,单片机最需要它做地址总线。
-
P3的第一功能是通用I/O 口,第二功能
2.6 时钟电路
前述所谓“XTAL1/2 接微调电容和石英晶体”的图解就在这里。
单片机执行指令的动作,均处在CPU控制器下辖的的时序控制电路的控制下,因此我们需要明确这些概念
- 时钟周期。单片机时钟控制信号的基本单位。, osc 即oscillation(振荡)之缩写。
- 机器周期。定义:CPU完成一个基本操作所需要的时间。每个机器周期为12个时钟周期。
- 指令周期。定义:执行一条指令所需要的时间。指令分为单周期指令、双周期指令和四周期指令(只有乘除)。
2.7 复位电路 2.8 最小应用系统 2.10 低功耗模式(略)
2.9 看门狗简介
育碧的《看门狗》名字便来源与此,这也是本人挺喜欢的一款游戏。
系统时刻需要被复位,看门狗的意义就是让单片机在失控后可以自己复位,而不需要外部的监视。
简而言之,看门狗的思想就是用一个计数器对系统时钟不断计数,当计数器溢出后看门狗就会把系统复位,因此如果程序运行正常,显然需要定期喂狗——也就是把看门狗计数器定期清零,否则看门狗就会发疯,在程序正常运行的条件下就把系统复位。
课后题(略)