本质
各种存储器都和CPU的地址总线(AB)、数据总线(DB)、控制总线(CB)相连,CPU在操控它们的时候把它们都当作内存来对待,把它们总的看作一个由若干存储单元(例如内存储器、接口里的寄存器)组成的逻辑存储器这个存储器我们称其为内存地址空间
接口
IO接口是计算机和外设信息交换的桥梁、纽带,通过I/O接口可实现计算机与外部设备通信,与外部设备交换信息
接口主要功能为
- 数据缓冲 :实现高速CPU与外部设备(速度较慢)的速度匹配
- 信号转换 :实现数字量和模拟量的转换,串行与并行格式的转换和电平转换
- 中断控制 :实现CPU与外部设备并行工作和故障自动处理
- 定时计数 :实现系统定时和外部事件计数及控制
- DMA传送 :实现存储器与I/O设备之间直接交换信息
接口的组成
典型的接口电路主要是由接口寄存器(数据寄存器、控制寄存器、状态寄存器)、数据缓冲单元和读/写控制单元组成的,接口寄存器也可以称之为 端口。数据寄存器是可读写的,用来存放与CPU与I/O设备交换的信息,控制寄存器用来存放CPU向外部设备发送的控制命令和工作方式的设置等。状态寄存器用来存放外部设备当前的状工作状态,供CPU查询。数据缓冲期是CPU与I/O设备信息传送的通道,它与CPU的数据总线相连,I/O设备与CPU交换信息都是通过数据缓冲器进行的,读/写控制单元与CPU的地址总线和控制总线相连,用于接收CPU对端口的选择和读写控制信号
接口的传输方式
接口按传输方式分类可分为并行接口和串行接口
并行接口
并行接口就是采用并行传输方式来传输数据的接口,并行通信就是指可以并行传输多位数据,它的传输速度比较快,但因为其抗干扰能力较弱,容易出错,当距离较远时成本会比较高,所以比较适合近距离传输
特点
- 多位(计算机的字长)并行传输、传输速度快、效率高
- 并行传递的信息不要求固定的格式
- 通信抗干扰能力差,不适合远距离传输
传输原理
并行接口主要通过联络信号来控制数据当传送,通过握手联络信号,发送端通知接收端是否有数据发送,接收端通知发送端它是否已准就绪。
具体输入输出当过程可以下面关于8255的内容
串行接口
串行接口是指采用串行通信方式来传输数据的接口,串行通信是指数据遵守时序一位一位地顺序传送,每位数据占据固定的时间长度,传输速度相对并行通信较慢,但线路简单抗干扰能力强,从而大大降低了成本特别适合远距离传输。
数据传送速率单位
- 数据传输率:指单位时间内传送二进制数据但有效位数,单位为bit/s或者bps(位/秒),数据传输速率越高,要求传输通道但频带越宽
- 波特率:指单位时间内信号电平变化但次数,反应但是数据信号对载波对调制速率。常用的标准波特率为110、300、600、1200、1800、2400、4800、9600和19200。其中,如果数据未进行压缩,由于传送数据时除传送数据信息外,还需传送校验位等信息,故波特率要高于数据传输率;如果数据进行了压缩,则数据传输率要高于波特率。
- 波特率因子:在串行通信方式中,发送端需要用时钟来决定每一位对应的时间长度,接收端也需要一个时钟来测定每一位的时间长度,前一个时钟叫发送时钟,后一个叫接收时钟,这两个时钟的频率可以时波特率的整数倍,一般为16、32或64,这个倍数就成为波特率因子
例:如果波特率因子为64,波特率为1200bps,那么时钟频率为1200*64=76.8kHz
传送方式
按照数据传送方式对不同,串行通信有单工、半双工、全双工三种方式
单工是指数据只能沿一个固定的方向传送,不能双向传送,例如广播我们只能收听它
半双工是指通信双方可以发送也可以接收数据,但不能同时收发数据,例如对讲机
全双工是指通信双方可以同时收发数据例如电话
通信控制方式
- 异步通信:数据以字符为单位按照约定的波特率进行传送,用起始位和停止位标识每个字符的开始和结束字符,通信双方不需要专门的同步信号,分别用各自的时钟信号来控制发送和接收
- 同步通信:去掉异步通信时每个字符的起始位和停止位,在数据块之前加上同步字符,在发送数据信号的同时发送一个时钟信号,使得发送端和接收端在约定的波特率下保持同步
端口浅谈
接口中的寄存器可以称为端口,上文中也提到CPU可以直接对端口进行读写,所以我们需要对端口进行编址使CPU能找到相应的端口进行读写
I/O端口主要分为以下两种编址方式(叫法可能由很多种例如统一编制也叫存储器映像寻址但意思相同)
统一编址
把每一个端口都看作一个存储单元,和内存储器一样统一编址,这样优点是访问存储器的所有指令均可用来访问I/O端口,而无须设置专门的I/O指令,简化了指令系统的设计,能用类型多、功能强的访问存储器指令,I/O端口空间可大可小,可使用外设数量上限增多,缺点是占用了内存空间的一部分,影响了系统的内存容量,由于内存地址较长,导致执行时间增加
独立编址
存储器和I/O端口在两个独立的地址空间中,用专门的IN/OUT指令来访问端口(地址总线的低16位 A15~A0来寻址端口最多可访问2^16次方 65536个端口),CPU的M/#IO(低电平有效)引脚信号来区分是I/O寻址还是存储器寻址。这样作优点是I/O和存储器寻址指令分开,程序可读性强;I/O指令长度短执行速度快;I/O不占用内存空间;I/O地址译码电路简单;缺点是CPU指令必须由专门的IN/OUT指令,这些指令功能不如存储器指令的功能强,且CPU还必须提供可区分访问内存和访问I/O的引脚信号
上面聊了聊接口、下面我们来实战体验一下
实战可编程定时计数器8253
概述
定时是指固定频率下的计数,例如我们在注册账号时填手机号接验证码,因为发送短信是有成本的,所以一般都限制短时间内不能发送第二次验证码
如图所示会给我们显示一个倒计时,其实现原理就是定时器每秒给我们改变一下按钮中的数值
计数功能则不然,例如我们在上课时老师会在门口数人(强行举例子,我们老师点名都不看人),来一个人就加一个,但张三8点来了,李四8点5分来了,刘二麻子8点半来的,他们来的频率并不固定,当然也可能8点5分、8点10分、8点15分···这就是巧合了。定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能。
在计算机系统中常需要用到定时信号,如系统日历时钟、DRAM的定时刷新等,
定时信号可以利用软件编程或硬件方法得到。
例如你可以写一堆nop指令来延时(设计一个延时子程序,子程序中全部指令执行时间的总和就是该子程序的延时时间。在CPU时钟频率一定时,子程序的延时时间是固定的)
这种方法比较简单、较易实现,只是需要了解延时子程序中每条指令的执行时间。
软件定时的定时时间不太精确,但使用方便,因此在软件开发中经常用到。但它仅适用于延时时间较短、重复次数有限的场合,否则CPU总是执行延时程序,占用了大量的时间,使CPU的利用率降低。故在对时间要求严格的实时控制系统和多任务系统中很少采用软件定时的方法。
硬件定时就是利用专用的硬件定时器/计数器,在简单软件控制下产生准确的延时时间。其基本原理是通过软件确定定时器/计数器的工作方式、设置计数初值并启动计数器工作,当计数到给定值时便自动产生定时信号。这种方法的成本不高,程序上也很简单,并且大大提高了CPU的效率,既适合长时间、多次重复的定时,也可用于延时时间较短的场合,因此得到了广泛的应用。
频率与时间
知道频率和时间的计算公式、以及单位换算非常重要,在后面我们会根据它们取计数初值
频率(物质在1s内完成周期性变化的次数叫做频率,常用f表示。)是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量,单位为秒分之一,符号为s-1。为了纪念德国物理学家赫兹的贡献,人们把频率的单位命名为赫兹,简称“赫”,符号为Hz,也常用千赫(kHz)或兆赫(MHz)或吉赫(GHz)做单位。1kHz=1000Hz,1MHz=1000000Hz,1GHz=1000MHz
公式f=1/T
1秒 = 1000毫秒 1s = 1000ms
1毫秒 = 1000微秒 1ms = 1000μs
1微秒 = 1000纳秒 1μs = 1000ns
1纳秒 = 1000皮秒 1ns = 1000ps
计数方式
定时器/计数器在计数方式上分为:减法计数器和加法计数器,而8253是减法计数器即给定一个计数初值其每来一个计数脉冲就减1直到为0时产生一个定时信号输出。因为它是减法计数器所以最大计数初值为0(圈起来要考的)
开始
8253芯片内部结构
8253芯片由数据总线缓冲存储器、读/写控制电路、控制字寄存器及3个完全相同独立的定时/计数器(计数器0、计数器1、计数器2),这三个定时/计数器和控制寄存器构成了8253的4个端口,其内部结构框图如图所示
8253芯片有24条引脚,封装在双列直插式陶瓷管壳内,其引脚信号如图
引脚图非常清晰的告诉了我们 它有两根地址线A1、A0,而CPU本质操作就是通过地址线选中操作谁,通过控制线表示作什么操作,通过数据线来传递数据,这两根地址线就用来选择当前操作的是那个端口
控制字寄存器用来存放由CPU写入8253的方式选择控制字,由它来定义8253中各通道的工作方式,其使用格式如图所示。8253方式选择控制字各位的功能介绍如下
使用一个定时/计数器的步骤如下(此步骤称作初始化),
1. 写控制字
通过A1、A0地址线选中控制字寄存器,设置:选择的那个定时/计数器(7、6位用于选择)、定义计数器操作(5、4位,00时为读取当前计数值,01,10,11 主要因为计数值可以是16位,但8253只有8根数据线,一次最多来八位数据),设置工作方式(3、2、1位,延时触发方式0145,自动重复触发方式23,启动分软件和硬件启动、软件启动GATE为高电平时、硬件启动是GATE上升沿触发),设置编码(0位,1为BCD码最大计数值9999,1为二进制计数最大计数值FFFF)
2. 写计数初值
每个定时/计数器内部有两个16位寄存器(相同端口地址):初值寄存器、计数寄存器,
我们将计数初值送入端口内(初值寄存器),计时启动,初值寄存器值不变,计数寄存器在变,因为它们是16位的,所以最大计数值是FFFFH(注意因为是减法计数器8253最大计数初值为0,0-1=FFFFH),作定时器时 计数器的初值=要求定时的时间/时钟脉冲的周期 如8253频率为2MH,5ms后输出高电平求初值 根据频率公式f=1(秒)/T(周期)可知 周期=1s/2MH =0.5微秒 初值=5毫秒/0.5微秒=10000
8253示例:
从地址上可知CNT2定时/计数器的地址为0122H,控制字寄存器地址为0123H,因时钟频率为2MH 可知 周期=1s/2MH =0.5微秒 初值=5毫秒/0.5微秒=10000 ,5ms产生输出高电平可用方式0、方式1,我们选方式0
MOV DX ,0123H ;控制寄存器地址
MOV AL,10110000B ; 通道2 先低后高 方式0 二进制
OUT DX,AL
MOV DX,0122H
MOV AX,10000
OUT DX,AL
MOV AL,AH
OUT DX,AL
工作方式备忘
8255A
并行接口8255A是通道型的接口,主要用于数据的输入或者输出,也就是CPU可以通过它给外设传数据(反之也可以给CPU传),例如点亮一堆二极管。
8255A芯片内部结构
8253芯片内部结构图如下
跟8253很相似,也是两根地址线A1,A0,通过他可以选中内部的四个端口
它含有3个独立的八位并行输入\输出数据端口A、B、C,每一个端口都是8位的,都可以作为输出或者输入接口,其中C端口又可以分成两个4位的端口来使用,通常数据端口A或数据端口B作为输入/输出的数据端口,而数据端口C作为控制或状态信息的端口(约定俗成,你拿C来传数据也随你),内部还有一个控制字寄存器
A组和B组控制电路是两组根据CPU的命令控制字控制8255A工作方式的电路,它们有控制寄存器,接收CPU输出的命令字,然后分别决定两组的工作方式
A组控制电路 控制数据端口A和数据端口C的上半部分PC7~PC4
B组控制电路 控制数据端口B和数据端口C的下半部分PC3~PC0
控制字
还是如8253一样,操作先选上控制字寄存器把命令字写好,8255A控制字主要可以实现工作方式的选择(工作方式以及数据传送的方向(是输出还是输入))、位的控制(仅用于C端口的置位复位(复位变0、置位变1))
控制寄存器是8位的
D7 为1时是在选择方式,为0时是对位进行控制
MOV DX ,xxxx ;控制寄存器地址
MOV AL,10010101B ; 选择方式、A端口方式0、A端口方向为输入、C端口高四位方向为输出、B端口方式1、B端口方向为输出、C端口低四位方向为输入
OUT DX,AL
MOV DX ,xxxx ;控制寄存器地址
MOV AL,00000111B ; PC3置位
OUT DX,AL
MOV AL,00000110B ; PC3复位
OUT DX,AL
工作方式浅谈
8255A一共有三种工作方式:
方式0:基本输入/输出方式(常用于连接简单外设、适用于无条件或查询方式)
方式1:选通工作方式(适用于中断控制方式)
方式2:双向传送方式 (A端口作为双向端口,适用于中断控制方式)
方式0应用的时候相当于三个独立的8位简单端口,各端口即可设置为输入口,也可以设置为输出口,但不能同时输入输出(c端口低四位中一位作为输入口,则低四位中其他位都应为输入口,但同时可设置高4为为输出),c端口也可以当成两个独立的4位端口,我们习惯用A、B来作数据但输入输出、用C来作为状态的输入
方式1主要用于中断控制方式下的输入输出
利用C端口的部分位用作选通控制信号来控制A和B端口数据的输入输出(除用作选通信号外的引脚,其他位可工作于方式0)
输出逻辑是这样的:“CPU将数据写入到数据端口,写完成(写周期结束)后通过C端口的某位引脚告知( pc脚->OBF#,此引脚接到外设OBF#)外设写完了,外设通过OBF#可知数据已经在数据端口内可以去取数据了,取数据完成外设通过ACK#于某位PC脚相连(ACK#->PC脚),并将OBF#变高电平(逻辑上让数据端口清空),并中断告知CPU(此时CPU可继续往数据端口写数据)”
输入逻辑也很类似,无非就是STB#接到某个PC脚,当它有效时,把输入进来的数据送入输入锁存器里,写满后IBF有效,并发出中断请求告诉CPU位写完了,你取走吧,CPU读完后IBF置为失效
方式2双向输入输出方式,其实就是选通信号复杂了罢了,故只有A端口可以用在方式2(A在方式2、B可以同时工作于方式1,这时c端口信号全都给用作选通了,B同时工作于方式0时,C端口的剩余位也可以工作于方式0)
参考资料
《汇编语言》-王爽
《穿越计算机的迷雾》- 李忠
《微机原理与接口技术》
西安交通大学MOOC-吴宁-第七次开课
北京交通大学MOOC-戴胜华-第五次开课