计算机的定时和计数通常是一回事。 提供定时和计数能力的芯片是 8253/8254
三个计数器结构相同,相互独立
- CLK 外部时钟信号
- Gate 门控制信号
- Out 对外输出信号
CPU 通过数据总线控制总线和 8253 挂接。
$A_1$ | $A_0$ | 功能 |
---|---|---|
0 | 0 | Counter0 |
0 | 1 | Counter1 |
1 | 0 | Counter2 |
1 | 1 | 控制端 |
对 8253/8254 编程
- 写入方式字
- 写入初值
$D_7$ $D_6$ | $D_5$ $D_4$ | $D_3$ $D_2$ $D_1$ | $D_0$ |
---|---|---|---|
计数器 | 读写格式 | 工作方式 | 数制 |
读写格式 |
- 00 锁存当前值
- 01 写低8位,高8位置0
- 10 写高8位,低8位置0
- 11 先写低8位,再写高8位
数制:
- 0 二进制
- 1 BCD
当初值为类似 2000 时,使用 BCD 有效提高写入速度(低8位为0,高8位为 0010 0000)
计算初值
$$ \text{定时时间} T_{out} = \text{计数初值}n \times 计数时钟周期 T_{CLK} $$ $$ \text{计数初值} n = \frac{T_{out}}{T_{CLK}} = \frac{f_{CLK}}{f_{out}} $$写入端口
使用 IN
和 OUT
命令进行编程
|
|
如果地址大于255,则需要间接寻址:
|
|
地址先写入 DX 内。
计数器工作方式
一共有6种工作方式
- 方式0 只能触发一次的负脉冲
- 方式 1重复触发的单稳态脉冲
- 方式2 分频器
- 方式3 放波发生器
- 方式4 软件触发单脉冲
- 方式5 硬件触发单脉冲
工作方式 | 功能 | GATE信号控制 | OUT输出波形 | 重新计数 |
---|---|---|---|---|
方式0 | 计数期间低电平输出 | 低时暂停,高时继续计数 | 写入初值后 OUT 变低,开始计数。计数结束后OUT变高 | 重新写入初值后立即重新计数 |
方式1 | 计数期间低电平输出 | 上升沿触发重新计数(重新装入初值) | 输出宽度为n个周期的低电平(不连续,需要手动进行重新计数) | 输出不连续(需要手动再次写入初值) |
方式2 | 周期性输出负脉冲 | 高电平 | 连续输出周期为n个CLK,宽度为1CLK的负脉冲 | 输出连续(自动重新计数) |
方式3 | 周期性输出方波 | 高电平 | 连续输出比例为1:1或近似1:1的方波 | 输出连续(自动重新计数) |
方式4 | 软件触发输出单脉冲 | 高电平 | 写入初值后OUT变高,n个CLK后输出1个CLK负脉冲 | 软件触发继(手动写入初值) |
方式5 | 硬件触发输出单脉冲 | 上升沿计数 | 写入初值后OUT变高,n个CLK后输出1个CLK负脉冲 | 硬件触发(GATE上升沿重新计数) |