当前位置: 首页 > news >正文

第8章 DMA控制器

  1. DMA的基本概念

DMA是用硬件实现不再通过CPU的,计算机内存储器与I/O设备之间的直接数据传送技术。该硬件称为DMA控制器(简称DMAC),用来控制数据的输入和输出,复杂性堪比CPU。

DMA方式可实现:

  1. 数据存储器RAM→I/O端口的DMA读传送
  2. I/O端口→数据存储器RAM的DMA写传送
  3. 数据存储器RAM→数据存储器RAM的存储单元传送
  1. 8237A主要特性

物理特性:使用单一的+5V电源,单相时钟,40条引脚,双列直插式封装。

具有4个独立的通道:每个通道都具有64K存储器寻址能力,一次传送的最大长度可达64K字节。可以在存储器和外设之间传送数据,也可以在存储器之间进行传送。

独立性:每一通道的DMA请求都可以分别允许和禁止。每一通道的DMA请求的优先权,可由编程规定为固定方式或旋转方式。

4种工作方式:单字节传送方式、数据块传送方式、请求传送方式、级联方式

级联能力:可以用级联的方式扩展通道数,最多可达16个DMA通道。

复位:有一条结束DMA传送的输入信号结束DMA传送或重新初始化:

  1. 8237A内部结构
  • 存储器地址寄存器
  • 传送字节数寄存器
  • 控制与状态寄存器
  • 数据缓冲寄存器
  1. 8237A初始化编程

  1. 输出主清除命令,使8237A处于复位状态,以接收新命令
  2. 写入工作方式寄存器,以确定8237A工作方式和传送类型;
  3. 写入命令寄存器,以控制8237A的工作;
  4. 根据所选通道,输入相应通道当前地址寄存器和基地址寄存器的初始值;
  5. 输入当前字节计数器和基字节数寄存器的初始值;
  6. 写入屏蔽寄存器
  7. 写入请求寄存器,便可由软件启动DMA传送。否则,经过(1)~(6)步编程后,由硬件控制通道DREQ启动DMA传送的过程

【例8-1】初始化8237A。对PC系列的DMA控制器8237A进行测试。测试程序对4个通道的8个16位寄存器先后写入全“1”和全“0”,再读出比较其是否一致。若不一致,则出错,停机。(设程序中的变量DMA地址是00H)

;检测前,禁止DMA控制器工作
MOV AL, 04H ;命令字,禁止8273A工作
OUT DMA+08, AL ;命令字送命令寄存器
OUT DMA+0D,AL ;命令字送清除屏蔽寄存器MOV AL, 0FFH ;全“1”检测
BEG:MOV BL, AL ;暂存AX到BX
MOV BH, AL ;
MOV CX, 8 ;循环测试8个寄存器
MOV DX, DMA ;FF写入0~3号通道的基地址或字节数寄存器
LP1:OUT DX, AL ;写入低8位
OUT DX, AL ;再写入高8位

  1. 8237A程序设计

目录

http://www.lryc.cn/news/515316.html

相关文章:

  • 后端java开发路由接口并部署服务器(四)
  • 检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?
  • 在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)
  • 单元测试3.0+ @RunWith(JMockit.class)+mock+injectable+Expectations
  • STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
  • MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 论文解读
  • LINUX线程操作
  • 在Lua中,Metatable元表如何操作?
  • 4D LUT: Learnable Context-Aware 4D LookupTable for Image Enhancement
  • 瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)
  • 使用SuperMap制作地形图的详细教程
  • PHP Array:精通数组操作
  • 【使用命令配置java环境变量永久生效与脚本切换jdk版本】
  • STM32-笔记32-ESP8266作为服务端
  • RAG(Retrieval-Augmented Generation,检索增强生成)流程
  • 【Python学习(六)——While、for、循环控制、指数爆炸】
  • 解释一下:运放的输入失调电流
  • 力扣hot100——二分查找
  • PHP 使用集合 处理复杂数据 提升开发效率
  • Unity 对Sprite或者UI使用模板测试扣洞
  • unity学习3:如何从github下载开源的unity项目
  • PHP后执行php.exe -v命令报错并给出解决方案
  • CDP集群安全指南-动态数据加密
  • 【shell编程】报错信息:Undefined Variable(包含6种解决方法)
  • Dubbo扩展点加载机制
  • unity学习7:unity的3D项目的基本操作: 坐标系
  • PyTorch框架——基于深度学习EfficientDeRain神经网络AI去雨滴图像增强系统
  • 写一个类模板三个模板参数K,V,M,参数是函数(函数参数、lambda传参、函数指针)
  • 国内Ubuntu环境Docker部署Stable Diffusion入坑记录
  • 现代光学基础6