您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 第八章-DMA控制器2
第十八讲:DMA控制器Intel8237•重点:DMA控制器芯片8237的内部寄存器,端口地址,编程与应用。•一、8237的内部寄存器组•8237有4个独立的DMA通道,有许多内部寄存器。前面表6-1已经给出了这些寄存器的名称、长度和数量,我们来详细介绍各个寄存器的功能和作用。•1、基地址寄存器•用以存放16位地址,只可写入而不能读出。在编程时,与当前地址寄存器同时写入某一地址,在8237进行DMA数据传送的工作过程中,内容不发生变化,只是在自动预置时,重新将初始地址写到当前地址寄存器中去。•2、基字节数寄存器•用以存放相应通道需要传送数据的字节数,只可写入而不能读出。编程时与当前字节数寄存器同时写入要传送数据的字节数。在8237进行DMA数据传送的工作过程中,内容保持不变,在自动预置时,将初始字节数重新写到当前字节数寄存器中去。•3、当前地址寄存器•存放DMA传送期间的地址值。每次传送后自动加l或减l。CPU可以对其进行读写操作。选择自动预置时,每当字节计数值减为0或外部有效后,自动将基地址寄存器的内容写入当前地址寄存器中,恢复其初始值。•4、当前字节数寄存器•存放当前的字节数。每传送一个字节,该寄存器的内容减1。当计数值减为0或接收到来自外部的信号时,会自动将基字节数寄存器的内容写入该寄存器,恢复其初始计数值,即为自动预置。•5、地址暂存寄存器和字节数暂存寄存器•这两个16位的寄存器和CPU不直接发生关系,我们也不必要对其进行读/写操作,因而对如何使用8237没有影响。•6、方式寄存器•每个通道有一个8位的方式寄存器,但是它们占用同一个端口地址,用来存放方式字,依靠方式控制字本身的特征位来区分写入不同的通道,用来规定通道的工作方式,各位的作用如下7.命令寄存器8.请求寄存器•用于在软件控制下产生一个DMA请求,就如同外部DREQ请求一样。D0D1用来表示向不同通道发出DMA请求。在软件编程时,这些请求是不可屏蔽的,利用命令字即可实现使8237按照命令字的D0D1所指的通道,完成D2所规定的操作,这种软件请求只用于通道工作在数据块传送方式之下。•9.屏蔽寄存器•8237的屏蔽字有两种形式:•①单个通道屏蔽字。这种屏蔽字的格式如图6-9所示。利用这个屏蔽字,每次只能选择一个通道。其中D0D1的编码指示所选的通道,D2=l表示禁止该通道接收DREQ请求,当D2=0时允许DREQ请求。•②四通道屏蔽字。可以利用这个屏蔽字同时对8237的4个通道的屏蔽字进行操作,故又称为主屏蔽字。该屏蔽字的格式如图6-10所示。它与单通道屏蔽字占用不同的I/O接口地址,以此加以区分。10.状态寄存器•状态寄存器存放各通道的状态,CPU读出其内容后,可得知8237的工作状况。主要有:通道计数已达到计数终点—对应位为1;通道的DMA请求尚未处理—对应位为1。•11.暂存寄存器•存储器到存储器传送过程中数据的暂存。•12.字节指针触发器•一个特殊的触发器,用于各16位寄存器的读或写低、高字节。此触发器状态为0时,进行低字节操作。低字节读/写完成后,字节指针触发器会自动置1,再操作一次清零。利用这种机制,可进行双字节读写操作,16位寄存器可仅占用一个外设端口地址,高、低字节共用。•二、8237的编程及应用•1.8237的寻址及连接•82374个通道中的寄存器及其它各种寄存器的寻址编码如表所示。从表中可以看到,各通道的寄存器通过CS*和地址线A3~A0规定不同的地址,高低字节再由字节指针触发器来决定。其中有的寄存器是可读可写的,而有的寄存器是只写的。•利用CS*和A3~A0规定寄存器的地址,再利用IOR*或IOW*控制对其进行读或写操作。注意,方式寄存器每通道一个,仅分配一个端口地址,由方式控制字的D1和D0位来区分不同通道。•CS*A3A2A1A0IOR*IOW*功能•0100001读状态寄存器•0100010写命令寄存器•0100110写请求寄存器•0101010写单通道屏蔽寄存器•0101110写方式寄存器•0110010字节指针触发器清•0110101读暂存寄存器•0110110总清•0111010清屏蔽寄存器•0111110写4通道屏蔽寄存器•2.8237在系统中的典型连接•注意到8237只能输出A15~A0十六位地址信号,在8086/88系统中,系统的寻址范围是1MB,地址线有20条,即A19~A0。为了能在8086/88系统中使用8237来实现DMA,需用硬件提供一组4位的页地址寄存器。通道0、1、2、3各有一个4位的页寄存器。在进行DMA传送之前,页寄存器可利用I/O地址来装入和读出。当进行DMA传送时,DMAC将A15~A0放在系统总线上,同时页寄存器把A19~A16也放在系统总线上,形成A19~A0这20位地址信号实现DMA传送。选择页寄存器DACK3选择页寄存器DACK2选择页寄存器DACK1选择页寄存器A19~A16DACK0A19~A16A15~A08237DMACPC机中8237的连接•3.8237的初始化•在对8237初始化之前,通常必须对8237进行复位操作,利用系统总线上的RESET信号或用软件命令对1101的地址进行写操作,均可使8237复位。•复位后,8237内部的屏蔽寄存器被置位而其它所有寄存器被清0,复位操作使8237进入空闲状态,这时才可以对8237进行初始化操作。•PC机中DOS对8237初始化部分说明:为了对DMAC8237初始化,首先进行总清。总清时只要求对总清地址进行写操作。•对DMAC(8237)的4个通道的基地址寄存器与当前地址寄存器、基字节数寄存器及当前字节数寄存器先写入FFFFH,再读出比较,看读写操作是否正确。若正确,再写入0000H,同样读出校验,仍正确则认为DMAC工作正常,开始对其初始化。若发现有错,停机。•每个通道的上述4个寄存器占用两个地址,故将循环计数器CX的内容置为8。•对DMAC(8237)的通道0初始化。PC机中,通道0产生对动态存储器的刷新控制。利用可编程定时器8253每隔15.0857μs向DMAC提出1次请求。DMAC响应后向CPU提出DMA请求。获得总线控制权后,使CPU进入总线放弃状态。在此DMA期间,DMAC送出刷新行地址,并利用DACK0控制产生各刷新控制信号,对DRAM一行进行刷新。一行刷新结束,HRQ变为无效,退出DMA通道0初始化程序如下:•OUTDMA+0DH,AL;总清8237•MOVDS,BX•MOVES,BX;初始化DS和ES•MOVAL,0FFH•OUTDMA+1,AL•OUTDMA+1,AL;通道0的传送字节数为64K字节,先写低位,后写高位•MOVDL,0BH;使DX=000BH(方式字地址)•MOVAL,58H•OUTDX,AL;写方式字,单字节传送方式,每次传送行地址•MOVAL,0;地址自动加1,允许自动预置•OUTDMA+8,AL;写入命令字•OUTDMA+10,AL;写入屏蔽字(单通道屏蔽字)DMAC8237传送数据到接口的电路•接口请求传送数据的信号经触发器74LS74的Q端形成,由三态门输出作为DMA请求信号。当DMAC响应接口请求时,送出存储器地址和控制信号,使选中存储单元的数据出现在系统数据总线D7~D0上。•同时,DMAC送出控制信号,将存储单元的数据锁存在锁存器74LS374中。在开始传送前,应当送出接口有效信号。该信号在系统工作中也可以一直有效。在接口请求DMA传送时,由逻辑电路产生控制信号,使CPU暂停执行指令,同时将总线置高阻•DMA初始化程序如下:•INITADM:OUTDMA+13,AL;总清•MOVAL,40H•OUTDMA+2,AL;送地址低字节到通道1•MOVAL,74H•OUTDMA+2,AL;送地址高字节到通道1,7440H为通道基地址•MOVAL,80H•OUTPAG,AL;送页地址1000B•MOVAL,64H•OUTDMA+3,AL;送传送字节数低字节到通道1•MOVAL,0;0064H表示100个字节•OUTDMA+3,AL;送传送字节数高字节到通道1•MOVAL,59H;通道1方式字:读操作,单字节传送•OUTDMA+11,AL;地址递增,自动预置•MOVAL,0;命令字:允许工作,固定优先级•OUTDMA+8,AL;DACK有效•OUTDMA+15,AL;写入四通道屏蔽寄存器,规定允许4个通道均可请求DMA传送。•习题:•1、Intel8237占几个端口地址?这些端口在读/写时操作过程中的作用是什么?•2、试说明由Intel8237控制,把内存中的一个数据块向接口传送的过程。•3、某8086系统中使用8237完成从存储器到存储器的数据传送,已知源数据块首地址的偏移地址值为71000H,目标数据块首地址的偏移地址值为81000H,数据块长度为100字节。试编写初始化程序,并画出硬件连接图。•4、某8086系统中使用8237完成从存储器到外设端口的数据传送任务,若已知通道0的地址寄存器、字节计数器、方式寄存器端口地址分别为0EEE0H,0EEE1H和0EEE8H,要求通过通道0将存储器中偏移地址为1000H~10FFH的内容传送到显示器输出,试编写初始化程序。
本文标题:第八章-DMA控制器2
链接地址:https://www.777doc.com/doc-1906954 .html