2021-07-05

第二章 单片机的硬件

本章部分内容涉及的寻址、中断等内容,将在后续章节介绍。


2.1 硬件组成
image-20210705143940468.png

  • 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个引脚。


2.png

这40个引脚可以分为三类

  • 电源及时钟引脚V_{CC}、V_{SS};XTAL1,XTAL2(注:XTAL 就是crystal 晶体)
  • 控制引脚 \overline{PSEN}、ALE/ \overline{PROG}、\overline{EA}/ V_{PP}、RST
  • I/O 引脚 4×8 = 32 个

选取一些较为具体地讲一下

  • XTAL1是片内时钟振荡器的反相放大器的输入端。若单片机使用片内时钟,该引脚接石英晶体和微调电容。若使用外部时钟时,该引脚接外部时钟振荡器的输出。
  • XTAL2是片内时钟振荡器的反相放大器的输出端。若单片机使用片内时钟时,该引脚同样接石英晶体和微调电容。若使用外部时钟,则该引脚悬空。
  • RST为复位信号输入端,上面没杠代表高电平有效。具体地说,如果给该引脚加超过两个机器周期(24个时钟周期)的高电平,则单片机复位。单片机正常工作时,这个引脚的输入应为 ≤ 0.5 V的低电平。看门狗让单片机复位的原理,就是当看门狗的定时器溢出时,看门狗定时器会向RST引脚输出一个长达8个机器周期的高电平,所以单片机就会复位。
  • \overline{EA}引脚意为地址使能(Enable Address)。这里的地址就是外部程序存储器(ROM)的地址空间,当 \overline{EA}的输入为高电平时,单片机先读片内ROM中的代码,再读片外ROM中存放的代码。当 \overline{EA}输入为低电平时,就只读取外部ROM中存储的代码。
  • ALE意为地址锁存使能(Address Latch Enable)。它的存在,是因为单片机的引脚数目有限,因此P0口是作为低8位地址总线和8位数据总线分时复用的。当单片机要和外界进行数据交流时(单片机要访问外部ROM/RAM),这时候P0口就要变成8位数据总线,在变成数据总线之前,ALE会进行一次负跳变,将P0口先发出的低8位地址锁存到P0口外接的地址锁存器中,完成这一操作后,P0口才能够放心大胆地去当它的数据总线。这也是地址锁存使能名字的由来。
  • \overline{PSEN} (Program Strobe ENable)。Strobe意为闸门,因此这个引脚的作用就是当单片机访问片外ROM读取指令码时,这个引脚在每个机器周期会产生两次有效信号(低电平信号)。

2.3 CPU

单片机的CPU由运算器和控制器组成

2.3.1 运算器

运算器用于对操作数进行算术、逻辑和位操作。运算器主要包括

  1. 算术逻辑运算单元(Arithmetic Logical Unit, ALU)。ALU可以对8位(单字节)的变量进行逻辑和算术运算,也可以对位变量进行逻辑运算和set、reset、complete等运算。

  2. 累加器A。CPU中使用最频繁的8位寄存器,为32个SFR之一。作用:

    • 作为ALU的输入之一,也是ALU输出结果的存放地。
    • 数据传送的中转站。但由于累加器只有一个,如果大家都要用累加器中转就会堵车,所以单片机增加了一部分数据传送指令,这使得某些数据的传送可以不经过累加器。累加器有一个进位位Cy(位于PSW中),这个Cy同时也是位处理器的(位)累加器
  3. 程度状态字寄存器(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的范围(2^{16} B = 64 KB),因此程序存储器最多只能有64 KB。

2.4 存储器(最难)

单片机的存储器空间可以划分成四类

2.4.1 程序存储器(ROM) 重要

单片机之所以可以按敌营的次序工作,就是因为ROM中存放了调试正确的程序。单片机的地址总线有16位,这意味着有共2^{16} B = 64 KB的空间可供程序指令居住。片内ROM是8 KB的Flash存储器,地址范围为0000H-1FFFH。片外可最大外扩64 KB的ROM,地址范围为0000H-FFFFH。在这里,我们会看到片内和片外ROM有一部分地址(门牌号)是相同的,但是!由于对片内ROM和片外ROM的寻址方式是不同的,所以即使门牌号相同也不会引起误解,系统根据指令,会知道到底是访问片内的0000H还是片外的0000H。

在ROM的使用中,需要注意两个问题:

  1. CPIU究竟是访问片内还是片外ROM,是由\overline{EA}引脚决定的。 当\overline{EA} = 0 时,片内的ROM是没人管的 即使里面储存有程序代码也没用。

  2. 程序存储器(ROM)中的一个单元对应一个字节,可以存放一条单字节指令。程序存储器的某些单元是给中断服务子程序留的,这些位专门作为中断服务子程序的入口地址

    3.png

    如上表所示,一共有6个单元是留给中断服务子程序做入口地址的。但大家也可以看,这些入口之间彼此的空间是很狭窄的,仅有8个单元,如果我们要写中断服务子程序,一般来讲肯定是写不下的,除非你的中断服务程序就一两条指令,而与此同时,ROM可是有着64 KB(2^{16}个单元)的空间,还有广阔天地可以用于储存程序。因此,通常的做法是在这些入口存放一条跳转指令,并在相应的地方再写上完整的中断服务子程序。这样,当中断触发时,CPU的PC值等于中断服务子程序入口地址时,PC就会根据相应的指令跳向那个储存着完整中断子程序的地方(那个地方才能真正称为中断服务子程序的入口地址,前述那个倒不如说是个藏宝图)。

    而且,由于单片机复位后PC的值变成0000H,我们可以看到,0000H和外部中断0的入口地址0003H之间仅仅隔着三个单元,这么狭窄的空间,主程序怎么可能写的下呢?但三个单元的空间放个跳转指令还是可以的,所以一般在0000H单元存放一条跳转指令,单片机一复位,CPU一读取这个跳转指令,就跳向主程序的入口地址。

2.4.2 数据存储器(RAM) 重要

单片机的片内RAM共有256B(256个字节),字节地址为00H-FFH
4.png

如上图,这个就是单片机内部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有

  1. 堆栈指针(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位,所以要压两个字节到堆栈)。为主程序之后做回原来的自己做准备。
    • 保护现场。单片机在“打断”主程序后,要执行子程序。而子程序的执行,很可能要用到单片机中的一些寄存器,而寄存器原有的内容,我们可能并不想被子程序修改。于是在执行子程序之前,有必要把这些寄存器现有的值保护起来,也压到堆栈里。当前时刻这些寄存器的值的集合,反映了这个时刻单片机的状态,形象点来理解,就有点类似于“犯罪现场”的意思,因此我们在利用子程序之前,有必要保护“现场”不受破坏。
  2. 寄存器B。乘除用,好理解。

  3. AUXR(AUXILIARY) 辅助寄存器。ALE和看门狗相关,好理解。

  4. 数据指针(DPTR0/1),便于访问RAM,不作为重点。AUXR1辅助寄存器(也是一个SFR)和数据指针相关

  5. 看门狗(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 口,第二功能
    5.jpg

2.6 时钟电路

6.jpg

前述所谓“XTAL1/2 接微调电容和石英晶体”的图解就在这里。

单片机执行指令的动作,均处在CPU控制器下辖的的时序控制电路的控制下,因此我们需要明确这些概念

  • 时钟周期。单片机时钟控制信号的基本单位。\displaystyle T_{OSC} = \frac{1}{f_{osc}}, osc 即oscillation(振荡)之缩写。
  • 机器周期。定义:CPU完成一个基本操作所需要的时间。每个机器周期为12个时钟周期。
  • 指令周期。定义:执行一条指令所需要的时间。指令分为单周期指令、双周期指令和四周期指令(只有乘除)。

2.7 复位电路 2.8 最小应用系统 2.10 低功耗模式(略)

2.9 看门狗简介

育碧的《看门狗》名字便来源与此,这也是本人挺喜欢的一款游戏。

系统时刻需要被复位,看门狗的意义就是让单片机在失控后可以自己复位,而不需要外部的监视。

简而言之,看门狗的思想就是用一个计数器对系统时钟不断计数,当计数器溢出后看门狗就会把系统复位,因此如果程序运行正常,显然需要定期喂狗——也就是把看门狗计数器定期清零,否则看门狗就会发疯,在程序正常运行的条件下就把系统复位。

课后题(略)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容