《微型计算机原理与接口技术》复习笔记(四)

使用教材为
《微型计算机原理与接口技术》(慕课版)
孙丽娟、李爱群、陈燕俐、周宁宁、邓玉龙编著

微机原理复习笔记一
微机原理复习笔记二
微机原理复习笔记三

微机原理复习笔记四

    • 中断系统
      • 1. 基本概念
        • 中断
        • 中断源
        • 中断类型码
        • 中断向量
        • 中断向量表
        • 中断类型码和中断向量表的关系
      • 2. 中断指令
        • STI
        • CLI
        • INT n
        • IRET
      • 3.8259A芯片的作用
      • 4.CPU响应中断的条件
      • 5. CPU响应可屏蔽中断的全过程
      • 6. 软件中断与硬件中断
      • 7. 中断应用举例
        • 日时钟中断
        • 用户中断
    • 串行异步通信
      • 8. 数据传输方式
      • 9. 数据帧的格式
      • 10. 波特率
      • 11.信号电平标准
      • 12.8250内部寄存器
      • 13. 初始化编程
      • 14. 收发程序
        • 查询方式
        • 中断方式
    • 并行接口
      • 15. 8255A结构
      • 16.8255A初始化
        • 工作方式
          • 方式0
          • 方式1
          • 方式2
        • 编程

中断系统

1. 基本概念

中断

CPU在执行程序的过程中,由于外部或内部事件的作用,使CPU停止当前正在执行的程序而转去为该事件服务,待事件服务结束后,又能自动返回到被中止了的程序中继续执行

中断源

能够引发中断的事件,即发出中断请求的来源

  • 分类
    外部中断(硬件中断)
     可屏蔽中断:输入到INTR引脚的中断请求信号引发的中断
     非屏蔽中断:输入到NMI引脚的中断请求信号引发的中断
    内部中断
     软件中断:执行有定义的INT n指令而引发的中断
     异常:CPU本身故障、程序故障等引发的中断

中断类型码

微型计算机系统给每一个中断分配的一个中断号n

中断向量

中断服务子程序的入口地址

中断向量表

存放256个中断号所对应的的中断向量的存储

  • 实模式下,CPU把256种中断向量组成一张表设置在系统RAM最低端的1K单元(0 ~ 3FFH)
  • 实模式下,中断向量表的大小为1024个字节

中断类型码和中断向量表的关系

n型中断向量存放在内存单元地址4n~4n+3这四个单元

单元 字节存放
4n n型中断服务子程序入口偏移地址低8位
4n+1 n型中断服务子程序入口偏移地址高8位
4n+2 n型中断服务子程序所在代码段段基址地址低8位
4n+3 n型中断服务子程序所在代码段段基址地址高8位

eg:(00180H)=44H ,(00181H)=55H,(00182H)=66H,(00183H)=77H,请问00180H~00183H中存放的是什么中断类型的中断向量?中断向量为多少?对应的物理地址是多少?
解:避免出错,将180H改为二进制数再右移2位
  得到中断类型码(60H)
  中断向量为 (7766H:5544H)
  对应的物理地址是 (7CBA4H)
计算方法见微机原理复习笔记一——80486三种工作模式

2. 中断指令

STI

功能:F寄存器中 I 标志置1,CPU处于开中断状态

CLI

功能:F寄存器中 I 标志置0,CPU处于关中断状态

  • STI,CLI只对可屏蔽中断请求有效

INT n

n 为中断类型码,为0~255中有定义的无符号整数
功能:无条件转向 n 型中断服务子程序

  • 执行过程
    F寄存器→栈(保存 INT n 之前的F状态)
      F 中 T 标志置0 : 禁止单步操作
      F 中 I 标志置0 : CPU处于关中断状态
    断点地址→栈
     先将断点所在段段基址→栈,再将断点偏移地址→栈
    CPU从4n~4n+3单元取出 n 型服务程序入口地址→IP、CS,从而转到 n 型中断服务子程序

IRET

中断服务子程序的出口指令
功能:依次从栈顶弹出6个元素→IP、CS、F
若栈顶是 INT n 的断点地址,则执行后返回断点

3.8259A芯片的作用

要求会计算
n (n<10)片8259A级联可管理 7n+1
eg:
PC/AT系统使用两片8259级联,可管理( 15 )级中断
33个中断源至少需要( 5 )片8259A进行管理

4.CPU响应中断的条件

可屏蔽中断(INTR)

  • 有可屏蔽中断请求,没有DMA请求,没有非屏蔽中断请求
  • CPU一条指令执行完
  • CPU处于开中断状态

非屏蔽中断(NMI)

  • 有非屏蔽中断请求,没有DMA请求
  • CPU一条指令执行完

5. CPU响应可屏蔽中断的全过程

  • 在指令的最后一个周期,检测INTR引脚
  • 检测到可屏蔽中断请求,满足上述响应条件,通过总线控制器向系统8259A发出中断响应信号
  • 获得8259A送来的中断类型码,在实模式下查询中断向量表,从而转向中断服务子程序

6. 软件中断与硬件中断

相同点

  • 都会引起程序中断
  • CPU获得中断类型码,取出中断向量,执行中断服务子程序

不同点

  • 引发中断的方式
    硬件:引脚发出的中断请求信号
    软件:INT n指令
  • 中断类型码的获取方式
    可屏蔽中断:8259A
    非屏蔽中断:自动产生
    软件中断:INT n指令
  • CPU响应非条件
    可屏蔽中断:可以被屏蔽
    非屏蔽中断:不可以被屏蔽
  • 中断处理程序的结束方式
    可屏蔽中断:先向8259A发出中断结束命令,再执行IRET指令
    软件中断:执行IRET指令

7. 中断应用举例

日时钟中断

中断源:8254的 0# 计数器,每55ms有一次中断请求
中断类型:08H

开发应用

  • 置换中断向量
    定时周期是 55ms 的整数倍:08H、1CH
    定时周期不是 55ms 的整数倍或者小于 55ms :08H
  • 若用户定义的中断类型是1CH型,服务程序结束前,不需要像主8259A发结束命令字,而如果是08H则需要
  • 定时中断服务子程序的执行时间必须远远小于定时中断的时间间隔
  • 避免DOS重入最简单的方法是中断服务子程序中不调用 INT 21H功能或者主程序、中断服务子程序不同时调用 INT 21H功能

eg:要求利用PC系列机上的 8254 的 0 号计数器引发的日时钟中断,设计程序,每间隔 1s 在PC在终端屏幕上显示一行字符‘HELLO!’,显示10行后结束

置换1CH

DATA SEGMENT
MESG DB 'HELLO!',0DH,0AH,'$'//0DH回车,0AH换行
OLD1C DD ?//存放系统原中断口地址
ICOUNT DB 18//中断次数(初值),一次55ms,18次1s
COUNT DB 10//显示行数
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
BEG:
    MOV AX,DATA
    MOV DS,AX
    CLI//置换中断向量需要先关中断
    CALL READ1C//转移系统1CH型中断向量
    CALL WRITE1C//写入用户1CH型中断向量
    STI//置换结束后开中断
SCAN: CMP COUNT,0//判断是否显示10行
     JNZ SCAN
     CLI//操作完成关中断
     CALL RESET//恢复系统1CH中断向量
     STI
     MOV AH,4CH
     INT 21H//结束程序,返回DOS
SERVICE PROC
        PUSH AX
        PUSH CX
        PUSH DX
        PUSH BX
        PUSH SP
        PUSH BP
        PUSH SI
        PUSH DI//保护现场,相当于PUSHA
        PUSH DS//DS=40H,执行INT 1CH的前提是DS=40H
        MOV AX,DATA
        MOV DS,AX//重新给DS赋值
        DEC ICOUNT//中断计数
        JNZ EXIT//不满18次转
        MOV ICOUNT,18//1s后对ICOUNT重新赋值
        DEC COUNT//显示行数减1
        MOV AH,9
        LEA DX,MESG
        INT 21H//显示字符串        
EXIT: POP DS//恢复现场
      POP DI//相当于POPA
      POP SI
      POP BP
      POP SP
      POP BX
      POP DX
      POP CX
      POP AX
      IRET//返回系统08H型中断服务子程序
SERVICE ENDP
READ1C PROC//转移系统1CH转移向量
       MOV AX,351CH
       INT 21H//通过INT 21H的35号子功能读取1CH的中断向量
       MOV WORD PTR OLD1C,BX//偏移地址
       MOV WORD PTR OLD1C+2,ES//段基址
       RET
READ1C ENDP
WRITE1C PROC//写入用户1CH型中断向量
        PUSH DS
        MOV AX,CODE
        MOV DS,AX
        MOV DX,OFFSET SERVICE
        MOV AX,251CH
        INT 21H
        POP DS
        RET
WRITE1C ENDP
RESET PROC//恢复系统1CH型中断向量
      MOV DX,WORD PTR OLD1C//偏移地址
      MOV DS,WORD PTR OLD1C+2//段基址
      MOV AX,251CH
      INT 21H//通过INT 21H的25号子功能写入1CH的中断向量
      RET
RESET ENDP
CODE ENDS
END BEG

置换08H

DATA SEGMENT
MESG DB 'HELLO!',0DH,0AH,'$'//0DH回车,0AH换行
OLD08 DD ?//存放系统原中断口地址
ICOUNT DB 18//中断次数(初值),一次55ms,18次1s
COUNT DB 10//显示行数
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
BEG:
    MOV AX,DATA
    MOV DS,AX
    CLI//置换中断向量需要先关中断
    CALL READ08//转移系统1CH型中断向量
    CALL WRITE08//写入用户1CH型中断向量
    STI//置换结束后开中断
SCAN: CMP COUNT,0//判断是否显示10行
     JNZ SCAN
     CLI//操作完成关中断
     CALL RESET//恢复系统1CH中断向量
     STI
     MOV AH,4CH
     INT 21H//结束程序,返回DOS
SERVICE PROC
        PUSH AX
        PUSH CX
        PUSH DX
        PUSH BX
        PUSH SP
        PUSH BP
        PUSH SI
        PUSH DI//保护现场,相当于PUSHA
        PUSH DS//DS=40H,执行INT 1CH的前提是DS=40H
        MOV AX,DATA
        MOV DS,AX//重新给DS赋值
        DEC ICOUNT//中断计数
        JNZ EXIT//不满18次转
        MOV ICOUNT,18//1s后对ICOUNT重新赋值
        DEC COUNT//显示行数减1
        MOV AH,9
        LEA DX,MESG
        INT 21H//显示字符串        
EXIT: POP DS//恢复现场
      POP DI//相当于POPA
      POP SI
      POP BP
      POP SP
      POP BX
      POP DX
      POP CX
      POP AX
      JMP OLD08//转向原来的08H型中断服务子程序
SERVICE ENDP
READ08 PROC//转移系统08H转移向量
       MOV AX,3508H
       INT 21H//通过INT 21H的35号子功能读取08H的中断向量
       MOV WORD PTR OLD1C,BX//偏移地址
       MOV WORD PTR OLD1C+2,ES//段基址
       RET
READ08 ENDP
WRITE08 PROC//写入用户08H型中断向量
        PUSH DS
        MOV AX,CODE
        MOV DS,AX
        MOV DX,OFFSET SERVICE
        MOV AX,2508H
        INT 21H
        POP DS
        RET
WRITE1C ENDP
RESET PROC//恢复系统08H型中断向量
      MOV DX,WORD PTR OLD08//偏移地址
      MOV DS,WORD PTR OLD08+2//段基址
      MOV AX,2508H
      INT 21H//通过INT 21H的25号子功能写入08H的中断向量
      RET
RESET ENDP
CODE ENDS
END BEG

用户中断

中断类型:71H
(举例见书P320)

中断处理过程

  • 开中断,保护现场
  • 向从8259A发出中断结束命令
    MOV AL,20H
    OUT 0A0H,AL
  • 执行 INT 0AH,转向0AH服务程序

串行异步通信

8. 数据传输方式

  • 单工方式:只允许数据按照一个固定的方式传送
  • 半双工方式:收、发双方均具备接受和发送数据的能力,但是数据不能在两个方向上同时传送
  • 全双工方式:收、发双方可以同时进行数据传

9. 数据帧的格式

为实现通信,收发双方一帧数据的格式和通信速率要保持一致

  • 起始位:一帧字符开始,为一位逻辑 0;若无数据处于逻辑 1 状态
  • 数据位:个数为 5~8 为,从最低位开始发送
  • 奇偶校验位:奇校验 、数据位加上奇偶校验位奇数个逻辑 1 ;偶校验 、数据位加上奇偶校验位偶数个逻辑1;也可无校验传输
  • 停止位:1位、1.5位或2位的逻辑1

10. 波特率

在此并未严格区分波特率与数据通信速率
单位时间内(每秒)传送信号的个数

eg:设异步通信一帧字符有8个数据位,无校验,1个停止位,如果波特率为9600,则每秒钟能传输多少帧字符?(960)传输一帧字符需要多少时间?(1/960秒)
解:一帧字符一共有10位
  每秒传输 9600/10 = 960 帧字符
  传输一帧字符需要 1/960 秒

11.信号电平标准

RS232信号采用负逻辑:“1”= -3V ~ -15V,“0”= +3V ~ +15V

12.8250内部寄存器

只列出需要掌握的内容

寄存器 功能 主串口地址 辅串口地址
发送保持寄存器 保存CPU送出的并行数据
转移至发送移位寄存器
3F8H 2F8H
接收缓冲寄存器 保存经转换的并行数据
等待CPU读取
3F8H 2F8H
通信线状态寄存器 提供数据传输的状态信息 3FDH 2FDH
中断允许寄存器 提供4级中断是否被允许的信息 3F9H 2F9H
MODEM控制寄存器 D3 ~ D0 控制引脚输出电平
D4 控制8250工作方式
3FCH 2FCH
除数寄存器 存放分频系数 高8位 3F9H
低8位 3F8H
高8位 2F9H
低8位 2F8H
通信线控制寄存器 规定串行异步通信的数据格式 3FBH 2FBH
  • 在发送保持寄存器空闲时,CPU才能写入数据
  • 除数寄存器的值必须在 8250 初始化时预置
  • 中断优先级:接收数据错中断(最高)→ 接收中断 → 发送中断 → MODEM中断(最低)

13. 初始化编程

  • 步骤
    ① 80H→通信线控制寄存器,使除数寄存器访问位=1
    ② 分频系数高/低8位→除数寄存器高/低8位,确定通信速率
    ③ D7=0的命令字→通信线控制寄存器
      定义一帧数据格式
      使除数寄存器访问位=0,从而使后继的对合用端口的访问只读写非除数寄存器
    ④ 设置中断允许命令字
      查询方式,则中断允许命令字=0,禁止中断
      中断方式,使中断允许命令字相应位置1
    ⑤ 设置MODEM控制寄存器
      中断方式:D3=1,允许8250送出中断请求
      查询方式:D3=0
      内环方式:D4=1
      正常通信:D4=0
      使用联络线:D1、D0位置1

  • eg: 编写一个子程序(主串口)
    (1)分频系数 = 0060H,一帧数据包括 8 个数据位,1 个停止位,无校验
    (2)采用查询方式,完成内环内检

I8250 PROC
      MOV DX,3FBH
      MOV AL,80H
      OUT DX,AL//设置寻址位
      MOV DX,3F9H
      MOV AL,0
      OUT DX,AL//除数高8位
      MOV DX,3F8H
      MOV AL,60H
      OUT DX,AL//除数低8位
      MOV DX,3FBH
      MOV AL,03H
      OUT DX,AL//通信线控制寄存器D7=0,规定数据格式
      MOV DX,3F9H
      MOV AL,0
      OUT DX,AL//设置中断允许寄存器
      MOV DX,3FCH
      MOV AL,10H
      OUT DX,AL//设置MODEM寄存器
      RET
I8025 ENDP     

14. 收发程序

查询方式

在发送数据前,读通信线状态寄存器(D5)获取发送保持或移位寄存器(数据口)是否空闲
在接收数据前,读通信线状态寄存器(D0)获取接收缓冲寄存器(数据口)是否已经收到1帧数据

eg:利用主串口查询方式发送一个字符“A”

SCAN: MOV  DX,3FDH
      IN   AL,DX
      TEST AL,20H//D5=1
      JZ   SCAN
      MOV  DX,3F8H
      MOV  AL,'A'
      OUT  DX,AL

利用辅串口查询方式接收一个字符

SCAN: MOV  DX,2FDH
      IN   AL,DX
      TEST AL,01H//D0=1
      JZ   SCAN
      MOV  DX,2F8H
      IN   AL,DX

中断方式

用系统机串行口采用中断方式完成字符发送和接收,编程时应采取哪些措施

  • 中断允许寄存器相应位置 1
  • MODEM控制寄存器 D3 =1
  • 8259A 相应中断屏蔽位置 0(主 8259A 主串口IR4:0CH,辅串口IR3:0BH)
  • CPU 处于开中断(STI)

并行接口

15. 8255A结构

  • 内部有 3 个 8 位的输入输出端口(即A口、B口、C口,从内部控制角度来讲分为A组和B组)、数据总线缓冲器、读写控制逻辑模块、A组和B组控制模块
  • A1、A0 是端口选择信号,当 C S ‾ \overline{CS} CS有效时
    A1A0 = 00,选中 A 口数据寄存器
    A1A0 = 01,选中 B 口数据寄存器
    A1A0 = 10,选中 C 口数据寄存器
    A1A0 = 11,选中控制寄存器
    注:不可从控制端口读取数据
A1 A0 R D ‾ \overline{RD} RD W R ‾ \overline{WR} WR C S ‾ \overline{CS} CS 操作
0 0 0 1 0 从A端口读取数据
0 1 0 1 0 从B端口读取数据
1 0 0 1 0 从B端口读取数据
0 0 1 0 0 向A端口写入数据
0 1 1 0 0 向B端口写入数据
1 0 1 0 0 向C端口写入数据
1 1 1 0 0 向控制端口写入命令字

16.8255A初始化

  • 方式选择控制字、C口按位置 0 / 置 1 控制字
    具体见考试附录

工作方式

工作方式 适用于端口
方式 0 A、B、C
方式1 A、B
方式2 A
方式0

基本型输入输出方式,即无条件输入输出方式,不需要联络信号

方式1

选通型输入输出方式,必须有联络线(输入:IBF、 S T B ‾ \overline{STB} STB;输出: O B F ‾ \overline{OBF} OBF A C K ‾ \overline{ACK} ACK

  • 输入
    IBF:  输入缓冲器满-----状态线(A:PC5,B:PC1
        只有在IBF = 0 时,外设才能写入数据
    S T B ‾ \overline{STB} STB: 输入选通信号,必须有(A:PC4,B:PC2
    INTE: 中断允许寄存器
        当PC4 = 1时,A 口允许中断
        当PC2 = 1时,B 口允许中断
    INTR:中断请求信号,高电平有效(A:PC3,B:PC0

  • 输出
    O B F ‾ \overline{OBF} OBF:输出缓冲器满-----状态线(A:PC7,B:PC1
        只有在IBF = 1 时,才能输出数据
    A C K ‾ \overline{ACK} ACK: 确认应答(A:PC6,B:PC2
    INTE: 中断允许寄存器
        当PC6 = 1时,A 口允许中断
        当PC2 = 1时,B 口允许中断
    INTR:中断请求信号,高电平有效(A:PC3,B:PC0

方式2

双向数据传输方式

编程

步骤:

  • 方式选择控制字 → 控制口
    目的:选择某一口的工作方式
  • 根据需要把C口按位置0/置1控制字 → 控制口
    目的:禁止/允许某一口提出中断请求
  • 完成初始化编程后,CPU可以用IN指令/OUT指令通过8255A和外设交换信息

eg:编写初始化子程序,端口地址为200H~203H
 (1)A口、B口工作在选通型输入方式
 (2)允许B口中断、A口禁止中断
 (3)无关项设置“0”
解:控制端口为203H,方式控制字为 B6H,C口按位置 0 / 置 1 控制字为08H(A)、05H(B)

I8255 PROC
      MOV DX,203H
      MOV AL,B6H
      OUT DX,AL//设置方式控制字
      MOV AL,08H
      OUT DX,AL//A口禁止中断
      MOV AL,05H
      OUT DX,AL//B口允许中断
      RET
I8255 ENDP
  • 如果数据口(A,B或C)工作在方式0
    直接采用IN/OUT指令对其进行读写
  • 如果数据口(A或B)工作在方式1,如果采用查询方式,且 A或B口定义为
       输入口,先用IN指令读入C口的内容,查询 IBF = 1 时,表示CPU可以用IN指令从A或B口读入外设送来的数据
       输出口,先用IN指令读入C口的内容,查询 O B F ‾ \overline{OBF} OBF =1 时,表示CPU可以用OUT指令向A或B口写数据以送给外设

你可能感兴趣的:(复习)