5.6 KiB
tags, create time
| tags | create time | ||||
|---|---|---|---|---|---|
|
2026-06-28 15:00 |
82C37A DMA 控制器
概述
82C37A 是 x86 系统的 DMA(Direct Memory Access,直接内存访问)控制器,允许外设与内存之间直接传输数据而不经过 CPU。在 3 套试卷中出现了 5 道填空题,是高频考点。本专题聚焦 S0 过渡时序、DACK 选中信号、字节计数器初始值和三条软命令。
正文
1. DMA 基本概念
DMA 传输的核心思想:让外设直接与内存交换数据,CPU 只负责让出总线控制权。
graph TB
subgraph "传统 I/O(CPU 参与)"
A1["外设"] -- "数据" --> B1["CPU"]
B1 -- "数据" --> C1["内存"]
end
subgraph "DMA 传输(CPU 不参与数据搬运)"
A2["外设"] -- "数据" --> C2["内存"]
D2["CPU"] -. "让出总线" .- E2["82C37A"]
E2 -. "控制传输" .- A2
E2 -. "控制传输" .- C2
end
2. S0 过渡状态 — HRQ → HLDA
82C37A 的工作时序分为多个阶段,其中 S0 是过渡状态,指从 DMA 控制器发出有效的 **HRQ(总线请求)**信号,到收到有效的 **HLDA(总线应答)**信号之间的时间。
sequenceDiagram
participant DMA as "82C37A"
participant CPU as "CPU"
participant IO as "I/O 设备"
Note over DMA: "DMA 请求产生"
DMA->>CPU: "HRQ(Hold Request)<br/>请求总线控制权"
Note over DMA,CPU: "S0 过渡状态"
CPU->>DMA: "HLDA(Hold Acknowledge)<br/>释放总线控制权"
Note over DMA: "获得总线控制权<br/>进入 S1~S4 数据传输"
DMA->>IO: "DACK 选中 I/O 设备"
DMA->>IO: "开始 DMA 数据传输"
Note over DMA,CPU: "S1~S4 传输状态"
DMA->>CPU: "传输完成,释放总线"
| 信号 | 全称 | 方向 | 功能 |
|---|---|---|---|
| HRQ | Hold Request | DMA → CPU | DMA 请求 CPU 让出总线 |
| HLDA | Hold Acknowledge | CPU → DMA | CPU 应答并释放总线 |
| DREQ | DMA Request | I/O → DMA | I/O 设备请求 DMA 传输 |
| DACK | DMA Acknowledge | DMA → I/O | DMA 应答并选中 I/O 设备 |
[!important] 信号配对关系
- HRQ / HLDA:DMA 与 CPU 之间的总线握手
- DREQ / DACK:DMA 与 I/O 设备之间的传输握手
[!question] 思考题 S0 状态结束时,82C37A 处于什么状态?
答:S0 结束后,82C37A 从被动工作状态过渡到主动工作状态,获得总线控制权,开始执行 DMA 传输周期(S1~S4)。
3. DACK — 选中 I/O 设备
在 DMA 有效操作周期内,82C37A 选中 I/O 设备的方式是发出有效的 **DACK(DMA Acknowledge)**信号。
- I/O 设备先发出 DREQ 请求 DMA 传输
- DMA 获得总线后,发出 DACK 通知该 I/O 设备"已选中你"
- DREQ 和 DACK 是成对出现的握手信号
graph LR
IO["I/O 设备"] -- "DREQ 请求传输" --> DMA["82C37A"]
DMA -- "DACK 选中设备" --> IO
DMA -- "HRQ 请求总线" --> CPU["CPU"]
CPU -- "HLDA 释放总线" --> DMA
4. 字节计数器 — 写入 N-1
82C37A 的字节计数器(Current Word Register)存储的是计数值减 1,因为计数器从设定值递减到 0 时产生 TC(Terminal Count)终止信号:
\text{写入值} = \text{传输字节数} - 1
| 传输字节数 | 写入值(十进制) | 写入值(十六进制) |
|---|---|---|
| 1 | 0 | 0000H |
| 256 | 255 | 00FFH |
| 1024(1K) | 1023 | 03FFH |
| 65536 | 65535 | FFFFH |
[!example] 真题计算 传输 1K 个字节 = 1024 字节,写入值 = 1024 - 1 = 1023 = 3FFH。
计数过程:3FFH → 3FEH → ... → 001H → 000H(TC 信号产生,传输结束)。 实际传输了 1024 个字节。
[!important] 核心公式
\text{实际传输字节数} = \text{计数器初值} + 1
5. 三条软命令
82C37A 有 3 条软命令,通过写特定端口地址触发(无需数据):
| 软命令 | 功能 | 说明 |
|---|---|---|
| 清先/后触发器 | 复位内部双字节读写触发器 | 确保下次读写从低字节开始 |
| 总清除(Master Clear) | 复位整个芯片 | 清除所有命令、状态和暂存寄存器 |
| 清屏蔽寄存器 | 清除所有通道的屏蔽位 | 使所有通道允许 DMA 请求 |
[!tip] 记忆技巧 三条软命令分别对应:触发器 → 全局复位 → 屏蔽清除,从局部到全局再到通道控制。
6. 真题回顾
[!example] 【真题】82C37A 的工作时序中,S0 是 82C37A 由被动工作状态过渡到主动工作状态的阶段,是指从发出有效的______信号,直到收到有效的 HDLA 信号之间的时间。
答案:HRQ(总线请求)
[!example] 【真题】在 82C37A 的工作时序中,过渡状态是指从发出有效的______信号,到收到有效的______信号之间的时间。
答案:HRQ;HLDA
[!example] 【真题】82C37A 在有效操作周期内,选中 I/O 的方式是发出有效的______信号。
答案:DACK
[!example] 【真题】若利用 82C37A 控制 DMA 传输,共传输 1K 个字节,在对 82C37A 进行初始化时,应该向字节计数器中写入______。
答案:3FFH(或 1023)
[!example] 【真题】DMA 控制器 82C37A 有 3 条软命令,分别是______、总清除和清屏蔽寄存器软命令。
答案:清先/后触发器