13.1 8253/8254 定时器与计数器
第 12 章说明了设备如何在事件发生时请求服务。可编程间隔定时器(programmable interval timer)可以产生精确定时的事件,不必让 CPU 用指令亲自计数。Intel 8253 及其兼容后继型号 8254 都包含三个独立的 16 位计数器。每个通道都有三个可见信号:
CLK提供被计数的脉冲。
GATE根据所选模式使能或控制计数。
OUT把通道的定时结果报告给其他设备或中断输入。
把时钟脉冲变成有用的输出
计数器从编程写入的重装值 开始,随输入时钟边沿改变状态。在模式 0(mode 0)中,OUT 起初为低,在终值计数后变高,形成单次延时。在模式 2中,OUT 每隔 个时钟产生一个宽度为一个时钟的低脉冲,形成速率发生器。在模式 3中,OUT 反复在高低电平之间切换,形成近似方波。
周期模式的重复频率为
例如,1 MHz 时钟配合 会产生 1 kHz 的重复频率。这个公式描述的是重复速率,而不是脉冲宽度。模式 2 产生很窄的低脉冲,模式 3 则把周期分成高低两段。当模式 3 的 为奇数时,高电平会比低电平多一个时钟。
初始可见状态很重要。模式 0 到达终值前,低电平 OUT 表示“延时尚未结束”;结束后,高电平 OUT 会保持。模式 2 和 3 中,GATE 从高变低会停止重复计数,并按模式规定强制或保持 OUT。因此,设计不仅要给出数值分频数,还必须说明 GATE 和 OUT 的电气含义。
按顺序写入控制字与计数字节
8253/8254 的数据总线为八位,但每个计数器保存 16 位。软件先写入一个控制字(control word),再向选定通道写入一个或两个计数字节。各字段如下:
| 位 | 含义 |
|---|---|
SC1:SC0 | 选择计数器 0、1 或 2 |
RW1:RW0 | 锁存计数、读写低字节、高字节或先低后高 |
M2:M0 | 选择工作模式 0 至 5 |
BCD | 选择 16 位二进制或四位十进制的二进制编码计数 |
常用的 RW=11 序列表示先最低有效字节(least significant byte, LSB),再写最高有效字节(most significant byte, MSB)。要装入 1234H,软件应先写 34H,再写 12H。交换顺序会悄悄装入 3412H:计数器仍会运行,但周期错误。只写第一个字节则让双字节装载一直未完成。
如果在计数变化期间分两次读取其字节,得到的值可能前后不一致。锁存命令(latch command)会把当前计数复制到保持寄存器,使两次读取描述同一个时刻。8254 还增加了回读命令,可以锁存多个通道的状态与计数。这些机制不会停止物理计数器,只是为软件创建一致快照。
可靠的定时器启动清单是:计算 、确认合法范围、选择模式、构造控制字、按声明顺序发送字节、建立 GATE,最后观察 OUT。下面的工作台会刻意暴露不完整写入和反序写入,而不是隐藏这些错误。
第 13.1 节把时钟边沿转换成了确定的延时和波形。第 13.2 节将让硬件自主完成更大的任务:在 CPU 暂时释放总线时搬运整块数据。