考纲:
第10周周四上:
http://newesxidian.chaoxing.com/live/viewNewCourseLive1?liveId=10492963
程序查询IO方式:
无条件传送方式:
有一些外设不需要查询它是否忙,直接对它读写,例如:开关、发光二极管、继电器
如何读开关的状态呢?
设置一个三态门,当我们给三态门加一个有效信号的时候,三态门就将开关的状态输出出来
(防止总线竞争)
这个有效信号如何生成呢?
可以用一个接口地址译码电路 来生成一个信号。也就是说我们用in指令来读接口的状态,给三态门发一个接口的地址,接口地址经过接口地址译码电路(如果地址正确)生成一个有效信号给三态门,让三态门导通。
注意:x86 接口地址只有16位
8086CPU 会在IOR信号的上升沿采样数据总线的低8位,将其送到寄存器
读输入设备 设计框图:
输出设备:
以最简单的指示灯为例:
要稳定的控制输出设备,输出接口上必须接一个具有存储功能的东西。
例如用D触发器,向D触发器写入一个0,那么只要CLK没有遇到上升沿,那么D触发器中
一直保持0,一直让指示灯亮
当然也可以用锁存器来替换D触发器
注意 数据线低8位一定是接偶地址单元 高8位一定是接奇地址单元
锁存器作为数据输出接口的一般连接模式
查询方式:
传输数据前先判断设备忙不忙
例如:
首先读取BUSY,如果BUSY是低电平
就加载数据到数据线,直到数据稳定时
加载一个STB 写信号,向外设写入,
此时外设的BUSY变为高电平,表示忙
如何读BUSY是否忙不忙:
第10周周四下:
多外设查询:
中断方式
标志寄存器入栈
关中断,响应中断过程不允许被再次中断
CS,IP入栈
第一次INTA:CPU通过INTA 中断应答引脚 发送一个负脉冲,告诉可编程中断控制器8259 :你刚才发出的中断请求我正在响应,你把中断向量码准备好
第二次INTA:CPU向8259发送第二次负脉冲,这时8259收到后,就应该将中断向量码放在
第8位的数据总线上,发送给CPU,CPU采样低8位的数据总线。
计算向量地址
查中断向量表,得到中断处理程序的内存首地址
STI 开中断指令:允许中断
第11周上:
可编程中断控制器8259
SP/EN:区分主片还是从片
IRR :中断请求寄存器
IR2 IR3 IR5 三个中断源 同时发来中断请求,所以这三位为1
IMR 中断屏蔽寄存器
IR2 的中断请求被被屏蔽了
ISR 中断服务寄存器
说明当前CPU正在执行IR6和IR4的中断请求,只能被有限级更高的中断源打断
比如说我们采用固定优先级,IR0优先级最高,IR7优先级最低
因为IR3 的优先级比IR4和IR6更高,所以8259会替IR3向CPU发送中断请求INT
为什么ISR中有多个1呢?
一定是中断嵌套,即正在执行中断时,被更高优先级的中断源给中断。
当8259收到INTA 中断应答时,会将IRR中对应位清0
将ISR中对应位置1
当CPU执行到中断例程的末尾时,将会向8259发送EOI命令
8259收到EOI命令后,就会将ISR中对应位置为0,表示中断例程已经执行结束
EOI命令:一般中断结束命令 End Of Intercept,因为有优先级的概念,所以
中断嵌套的情况下,先结束的必然是优先高的中断请求,所以不需要明确告诉
8259将哪一位清0,只需要从右向左清0即可。
特殊中断结束命令:允许中断中断嵌套,但是没有正常优先级的概念,需要明确告诉8259该把哪一位清0
自动结束方式:不允许中断嵌套,所以ISR中只可能有一位为1,这种情况下不需要CPU向
8259发送EOI命令,8259会自动在第二个INTA信号后,直接将该位清0。
8259工作方式:
加电后默认是固定优先级
如果8259的数据总线如果要加双向驱动器,就让8259工作在缓冲方式下。
这时SP/EN引脚就是EN功能,双向驱动器的OE 引脚的信号由8259的EN引脚来提供。
那么如何区分主片还是从片呢?这时需要向特定寄存器中的某一位写入0或者1来区分主片
还是从片。
否则就让8259工作在非缓冲方式下:
SP/EN 加高电平就是主片,加低电平就是从片
优先级规定:
今年补考题考过自动循环优先级:
比如说IR4被处理后,其优先级会自动被降为最低,即IR7之后。
题目可能让你写出现在的优先级顺序
指定循环优先级:想要修改默认的优先级,修改完成后,就固定下来。
例如指定IR3 的优先级最高,那么优先级的顺序就为IR3 IR4 IR5 IR6 IR7 IR0 IR1 IR2
如果不需要级联:一般嵌套方式
如果需要级联,级联方式下的主片应该设置为特殊全嵌套方式
如果设置为一般嵌套方式(只允许高优先中断请求来中断当前中断例程),就会存在以下问题:
特殊全嵌套方式:
同级和更高级都能中断当前中断例程
从片以及单片工作时都设置为一般嵌套方式
主片和从片如何嵌套工作的?
从片的两个SP必须接地,表示是从片
ICW3 3号初始化命令字,是8259内部的一个寄存器
这个寄存器要针对电路的连法设置为相应的内容,
例如两个从片分别接到了主片的IR3和IR6上
所以主片的ICW3的3和6位上应该为1,告诉主片IR3和IR6接的是从片
而不是中断源
上面的从片接的是主片的IR3 ,所以ICW3应该设置为011
下面的从片接的是主片的IR6,所以它的ICW3应该设置为110
中断应答:
主片在收到中断应答之后,当然会将中断服务寄存器相应位置1,中断请求寄存器相应位清0
但是两个从片都收到了中断应答,谁来响应这个中断应答呢?
主片在收到中断应答后,CAS引脚三根线会发送一个级联地址出来
比如说送一个011,那么从片1就会响应中断应答,将自己的
中断服务寄存器相应位置1,中断请求寄存器相应位置0
当8086送第二个INTA 负脉冲来的时候,由从片来提供中断向量码
8086的第一个INTA负脉冲相当于将从片1选中了,
所以当第二个INTA负脉冲来的时候,
从片1就会将中断向量码送到D0到D7上发送给CPU
8086CPU在INTA的上升沿采样低8位的数据总线就可以得到中断向量码
OCW1 中断屏蔽寄存器
第11周下:
ICW2:中断向量码的高5位是可以写入的,低3位是写入不了的
低3位是由8个中断源的编号决定的。
比如说,向高5位写入01001 那么IR0中断源对应的中断向量码
就是01001 000 就是48H
ICW4:
如果8259级联工作,主片的SFNM一定要写1,让它工作在特殊全嵌套方式下
单片工作和多片级联下的从片工作在一般嵌套方式下,SFNM一定要写0
ocw1:
OCW2:通过写这个寄存器可以给8259发EOI命令,设置优先级
OCW3:
使用8259:
8259的A0接的是系统总线的A1
数据总线接的是8086数据总线的低8位
8086CPU不论是访问接口还是访问内存:
如果访问的偶地址的字节,一定会通过低8位来传输
如果访问的奇地址的字节,一定会通过高8位来传输
由此我们推断8086访问8259,访问的接口地址一定是偶地址
也就说A0一定是0
读信号写信号一定要连接接口读,接口写,去读和写接口芯片内部的寄存器
分析占用的接口地址为:
FF00H 和 FF02H
13 0001 0011
单片工作不需要写ICW3 ,ICW3要跳过
测试程序:
第12周上:
http://newesxidian.chaoxing.com/live/viewNewCourseLive1?liveId=10492965
第12周下:
http://newesxidian.chaoxing.com/live/viewNewCourseLive1?liveId=10492966