笔记「微机原理」

第 2 章

  • 8086: 第一代 16 位微处理器

  • 首次引入流水线思想, 指令级流水线

  • 存储器分段管理

  • 输入输出独立编址 (IN/OUT 指令)

  • 内存分段, 寻址空间 1M

  • 接口不分段, 寻址空间 64KB

  • 无法进行浮点数运算

8088 8 位

总线接口单元 BIU, 执行单元 EU, 通过总线传输数据.

指令队列: BIU 从内存中取指令放入指令队列, 控制电路从队列中取指令译码并进行相应的任务, EU 从总线上取数据进行计算.

一定程度的并行.

AX, BX, CX, DX, SI, DI, SP, BP, DS, CS, ES, SS

只有 BX, DI, SI 可以寄存器间接寻址 ([BX])

基址变址的基址只能是 BX, 即不可以 [SI + DI]

位移指令, 如果不是 1, 默认放在 CX 里

串操作指令计数是 CX, 源地址在 SI, 目的地址在 DI

flags:

  • AF: 后四位向前四位进位 / 借位 (无符号数)

  • CF: 无符号数进位 / 借位

  • PF: 结果奇偶, 0 = 奇, 1 = 偶

  • ZF: 结果 0

  • SF: 符号位, 最高位为 1, SF = 1.

  • OF: 有符号数溢出

  • DF: 方向标志位, 标志串操作指令的方向, 0 = 地址增方向, 1 = 地址减方向.

  • IF: 中断标志位, 1 = 中断打开

  • TF: 调试用, 1 = 执行一句指令后暂停

8086 设计成奇偶地址 (以字节编址) 分开存储.

偶地址时, $\rm A0$ 一定为 $\rm 0$, 所以偶地址存储体的选择信号表示为 $\rm A0 = 0$, 芯片上就是 $\rm A0$ 接在偶地址存储体的片选信号 $\rm \overline{CS}$ 上.

基地址选择信号用另一个信号 $\rm \overline{BHE} = 0$ 表示, 接在奇地址存储体的片选信号 $\rm \overline{CS}$ 上.

为什么不用 $\rm \overline A$: 16 位机器, 支持同时操作 16 个位, 即 2 字节, 需要同时选上两个片选. (从奇地址读 16 位的话, 需要读两次, 所以需要数据对齐到 16 位)

0 x 0 0 0 0 0 1 x x x x x 0 F C A 0 0 0 0 8 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 R i O n M t B I v O e S c

不需要理解芯片内部结构

  • $\rm VCC, GND, CLK, RESET$

  • $\rm AD0$ - $\rm AD19$: 地址和数据线, 分时复用

  • $\rm INTR$: 中断请求, 高电平有效

  • $\rm NMI$: 不可屏蔽中断请求

  • $\rm \overline{BHE}$: 奇地址选择信号, 见奇偶地址存储体

  • $\rm MN / \overline{MX}$: 最小模式 / 最大模式, 最小模式只有 8086 一个处理器, 最大模式可以接其他协处理器 (如 8087 浮点数运算器)

  • $\rm READY$: 等待 IO, $\rm READY$ 接收, 外设读写完成发送 $\rm READY$, CPU 进行下一步. (要和时钟同步)

最小模式下:

  • $\rm HOLD, HLDA$: DMA 请求, 应答
  • $\rm \overline{INTA}$: 中断应答, 见中断
  • $\rm \overline{RD}, \overline{WR}$ 读, 写信号
  • $\rm M / \overline{IO}$, 内存 / IO 选择信号
  • $\rm ALE$: 锁存信号, 见锁存
  • $\rm DT / \overline{R}$: 数据发送 ($\rm T$) 或者接收 ($\rm \overline{R}$)
  • $\rm \overline{DEN}$: 表示 $AD$ 引脚现在是数据

最大模式下:

TODO

接的多了, 直流, 交流信号变化, 可能导致 0, 1 数据的变化. 驱动器接某个引脚, 负责 “加强信号”. 见 负载

地址或数据 (或其他复用的引脚) 会变化, 比如地址通过 $\rm AD$ 送出到总线, 在外设看来, 要保证不变. 外部加锁存器即可. 什么时候锁由 8086 通过 $\rm ALE$ 引脚发出锁存信号.

  • 74LS373:
    • $\rm D0$ - $\rm D7$: 输入
    • $\rm Q0$ - $\rm Q7$: 输出
    • $\rm LE$: 锁存
    • $\rm \overline{OE}$: 三态门使能

不复用不需要锁存. 输入不需要锁.

利用 $\rm M/ \overline{IO}$ 和 $\rm \overline{RD}, \overline{WR}$ 进行逻辑电路设计, 得到 $\rm \overline{MEMR}, \overline{MEMW}, \overline{IOR}, \overline{IOW}$

第 3 章

  • 立即寻址: mov ax, 55H
  • 直接寻址: mov ax, [55H]
  • 寄存器寻址: mov ax, bx
  • 寄存器间接寻址: mov ax, [bx]
  • 寄存器相对寻址: mov ax, [si + 55H]
  • 基址变址寻址: mov ax, [bx + si]
  • 基址变址相对寻址: mov ax, [bx + si + 55H]
段名 segment <对齐方式> <组合方式> <类>

段名 ends
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
stack segment
  db  500 dup(0)
stack ends

data segment
; your data
data ends

code segment
  assume cs:code, ds:data, es:data, ss:stack
start:
  ; 需要指定 ds, ds 必须要用一个寄存器赋值
  mov ax, data
  mov ds, ax
  ; some code
  ; 正常返回 DOS 中断
  mov ah, 4Ch
  int 21H
code ends
end start

或者:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
.stack 100H
.data
; your data
.code
start:
  mov ax, @data
  mov ds, ax
  ; some code
  mov ah, 4CH
  int 21H
  end start
1
2
3
4
5
6
7
8
.data
; [var_name] [size] [value]
; [list_name] [size] [values]
var1 byte 10H
var2 word ?
list1 dword 1, 2, 3
list2 qword 5 dup(?)
str byte 'Hello World', 0DH, 0AH, '$'
  • offset: 返回符号的偏移地址
1
2
3
4
.data
var dw 0
.code
mov ax, offset var
  • ptr: 返回符号所在位置的内容, 前面需要 size 修饰
1
2
3
4
5
.data
var dd 12345678H
.code
mov al, byte ptr var
mov bx, word [var+1]
1
2
3
4
fun proc
  ; some code
  ret
fun endp

地址仅能使用 dx, 数据仅能使用 al / ax

1
2
3
4
mov dx, addr
in dx, al; read byte from addr into al
mov dx, addr2
in dx, ax; read word from addr into ax
1
2
3
4
5
6
mov dx, addr
mov al, data_byte
out dx, al; write byte to addr
mov dx, addr
mov ax, data_word
out dx, ax; write word to addr

第 4 章

  • ISA 总线: 并行, 8 位 (XT 总线), 16 位 (AT 总线)
  • PCI 总线: 并行, 32 位, 64 位, 数据和地址复用
  • PCIe 总线
    • 串行差分 (线与线之间影响小)
    • 全双工 (可以同时双向传输)
    • 编码率高 (PAM-4, 4 电平表示两个连续比特位)
    • 端到端传输 (交换结构, 类似交换机的机制, 不需要总线仲裁)
    • 多通道 (每个通道串行独立)
    • 软件向下兼容 PCI
  • RS-232C: 串行, 三线经济方式, 调试单片机
  • IDE (PATA): 并行, 连接辅存 (机械硬盘)
  • SATA: 串行, 连接辅存 (机械硬盘)
  • USB: 串行
    • USB 2.0: 四线, 差分, 单双工
    • USB 3.1, 3.2: 多 4 根差分线用来接收和发送, 全双工
    • USB 3.2: 需要 Type-C (Type-C 通道中心对称并且冗余一面, 所以可以正反插), 利用 Type-C 的另一个空闲通道
    • USB4

解决方法: 用负载通过一个三态门接到总线上. 三态门可控输出高阻态 (相当于断开, 非 0 也非 1)

  • 直流负载 (电流): 负载的输入电流和要小于驱动输出电流, 一根线要么是低电平要么是高电平, 所以高低电平输入独立求和.
  • 交流负载 (电容): 负载分布电容和要小于驱动

驱动器:

  • 74LS244: 单向驱动器
    • $\rm A0$ - $\rm A7$: 输入
    • $\rm Y0$ - $\rm Y7$: 输出
    • $\rm \overline{OE1}, \overline{OE2}$: 三态门使能
  • 74LS245: 双向驱动器
    • $\rm A0$ - $\rm A7$, $\rm B0$ - $\rm B7$: 输入 / 输出
    • $\rm DIR$: 方向控制信号 ($\rm DIR = 1$, $\rm A \rightarrow B$)
    • $\rm \overline{OE}$: 三态门使能

貌似是考试重点

  • 内存板
    1. 看电路板的地址, 当总线地址在该范围内, 才可以接通. 找哪些地址线需要参与 “片选”, 并且利用译码器或者逻辑门设计
    2. 总线上有使用电路板信号, 才可以访问电路板, 所以使用电路板信号需要参与 “片选”. 如电路板是内存, 那么总线上的 $\rm \overline{MEMR}, \overline{MEMW}$ 需要参与 “片选”
    3. 同时还要看数据传输方向, 接 74LS245 的 $\rm DIR$ 引脚
  • 接口板
    1. 看地址
    2. 接口读写 $\rm \overline{IOR}, \overline{IOW}$
    3. 数据传输方向
    4. 需要多考虑一个 $\rm AEN = 0$ (DMAC 提供) 参与 “片选” (与 DMA 有关防止总线竞争有关)
  • 线间串扰
  • 反射

第 5 章

  • SRAM
    • $\rm D$: 数据
    • $\rm A$: 地址
    • $\rm \overline{WE}$: 写信号
    • $\rm \overline{OE}$: 读信号 (数据输出允许)
    • $\rm \overline{CS}$: 片选信号
  • EPROM
    • $\rm D$: 数据
    • $\rm A$: 地址
    • $\rm \overline{OE}$: 读信号 (数据输出允许)
    • $\rm \overline{CE}$: 片选信号
    • $\rm \overline{PGM}$: 编程脉冲输入信号, 读时为 1 (一般读的时候直接接地让他为 0)
  • E2PROM
    • $\rm D$: 数据
    • $\rm A$: 地址
    • $\rm \overline{OE}$: 读信号 (数据输出允许)
    • $\rm \overline{WE}$: 写信号
    • $\rm Ready/\overline{Busy}$: 写时, 地址数据稳定后会写入 E2PROM 的缓冲区, 从缓冲区写入 ROM 需要等待较长时间, 此时 $\rm \overline Busy$ 低电平, 表示正在忙. 将一个接口地址译码 ($\rm AEN, \overline{IOR}$ 也参与) 到一个三态门使能端, 三态门有向连接 $\rm \overline{Busy}$ 和某一个数据线. mov dx, addr; in al, dx 即可读取总线上的数据, 判断是否可写完 (忙等待)
  • Flash, 闪速 E2PROM

一般是总线连接内存板, 总线有 $\rm A$, $\rm D$, $\rm \overline{BHE}$, $\rm \overline{MEMW}$, $\rm \overline{MEMR}$

  1. 数据, 内存读写直接连
  2. 内存板的地址引脚连对应总线上的
  3. 剩下总线上的高位地址线, 译码连接片选, 即可实现将内存地址映射到 8086 的某段地址上
  • 字扩展: 地址更多, 增加译码即可

  • 位扩展: 比特更多, 按字节编址, 正好对应奇偶存储体, 需要注意:

    • $\rm A1$ 开始是 字地址, 译码选中两片
    • $\rm A0$, $\rm \overline{BHE}$ 奇偶存储体选择, 参与译码片选
    • 以上两者取逻辑与连接到片选
  • 逻辑门电路

  • 3-8 译码器

  • ROM: 片选和三态门使能有效, 根据需要写入内容.

  • 数字比较器 (74LS688)

  • PLD (可编程逻辑器件)

片选信号线上加上拉电阻接 VCC, 防止三态门关闭高阻时信号随机导致选中.

第 6 章

8086 三个中断相关引脚:

  • $\rm NMI$: 不可屏蔽中断请求, 上升沿有效 (用于掉电检测等)
  • $\rm INTR$: 外部中断请求
  • $\rm \overline{INTA}$: 中断应答

$\rm INTR$ 和 $\rm \overline{INTA}$ 接中断控制器 8259, 同时接低 8 位数据线, 用于发送中断向量

8086 与 8259 的通信过程:

  1. 8259 通过 $\rm INTR$ 发送请求, 表示需要发送中断
  2. 8086 如果满足应答中断条件 (如指令执行完成并且外部中断允许, 即 IF 标志位为 1), 则通过 $\rm \overline{INTA}$ 送一个负脉冲, 表示可以接收中断请求
  3. 8259 向地址线低 8 位写中断向量
  4. 8086 通过 $\rm \overline{INTA}$ 送一个负脉冲, 并在其上升沿采样地址线低 8 位, 得到中断向量

256 * 4B, 高 2B 表示 cs 的内容, 低 2B 表示 ip 的内容 (小端序), cs:ip 是中断程序地址

  1. 保护断点: 硬件完成
  2. push flags
  3. 关中断 (IF = 0, TF = 0)
  4. push cs
  5. push ip.
  6. 中断处理: 编写中断处理程序
  7. push regs 保存寄存器上下文
  8. <sti 开中断, 允许嵌套的话>
  9. 中断处理
  10. <cli 关中断, 允许嵌套的话>
  11. <EOI, 中断结束命令, 允许嵌套的话, 向 8259 发送命令告诉它完成了一个中断处理程序>
  12. pop regs
  13. iret
  • $\rm IR0$ - $\rm IR7$: 8 个中断请求输入
  • $\rm INT$: 接总线 $\rm INTR$
  • $\rm \overline{INTA}$: 接总线 $\rm \overline{INTA}$
  • $\rm D$: 接总线 $D$, 输出中断向量
  • $\rm \overline{RD}$: 读
  • $\rm \overline{WR}$: 写
  • $\rm A0$: 地址, 用于接口地址, 编程 8259 内部寄存器
  • $\rm \overline{CS}$: 片选
  • $\rm CAS0, CAS1, CAS2, \overline{SP}/\overline{EN}$: 与级联有关

如果是 8086, 8259 的 $\rm A0$ 需要连总线的 $\rm A1$, 因为总线的 $\rm A0$ 是偶地址存储体选择信号, 当它是 0 是数据线用的是 $\rm D7$ - $\rm D0$, 与 8259 地址线相连. 而总线奇地址用 $\rm D8$ - $\rm D15$ 传输数据, 所以 $\rm A0 = 1$, $\rm \overline{BHE} = 0$ 时, 数据无法输入. 所以一定有 $\rm A0 = 0$, 那么 8259 的 $A0$ 就要用总线上的其他地址线如 $\rm A1$ 接

都是 8 位.

  • IRR: 中断请求寄存器: 第 i 位为 1, 说明此时 $\rm IRi$ 引脚所接设备发出了一个中断请求
  • ISR: 中断服务寄存器: 第 i 位为 1, 说明 CPU 没有执行完 $\rm IRi$ 的中断请求
  • IMR: 中断屏蔽寄存器: 第 i 位为 1, 表示不响应 $\rm IRi$ 的请求, 没接的引脚可以设置屏蔽
  • ICW1 - ICW4: 初始化命令字, 见初始化编程
  • OCW1 - OCW3: 操作命令字, 见操作方式编程

允许嵌套时, 可以设置优先级, 采用一般 EOI, 不需要指定将 ISR 哪一位清零, 由 8259 的优先级模式自动控制

  • 固定优先级:
    • $\rm IR0$ 最高, $\rm IR7$ 最低.
    1. IRR & (~IMR) 与 ISR 比较, 如果有高优先级的, 则在 $\rm \overline{INTA}$ 的第一个负脉冲到来时, clear IRR, set ISR.
    2. 当中断程序结束时, 接收 EOI, clear lowbit(ISR) (不用指定 clear 哪一个)
  • 自动循环优先级:
    • 刚处理过的 $\rm IRi$ 优先级最低, $\rm IR_{i+1}$ 优先级最高
  • 指定循环优先级:
    • 编程指定一个最低的 $\rm IRi$, $\rm IR_{i+1}$ 优先级最高

允许嵌套的情况下

  • 一般嵌套方式: 优先级高的打断优先级低的, 同级不可以打断
  • 特殊全嵌套方式: 判断接的是不是从片, 如果是, 这个引脚同级的也可以打断, 如果不是, 则不可以

级联就是将 $\rm IRi$ 连接到另一个 8259, 这样就有更多的接口了. 从片有优先级, 但都是发到主片的同一个引脚, 所以主片的同级需要打断

电路:

  • $\rm \overline{SP}/\overline{EN}$ 接高电平表示主片, 接低电平表示从片.
  • 从片的 $\rm INT$ 接主片的 $\rm IR$
  • 从片的 $\rm \overline{INTA}$ 接总线
  • 从片的 $D$ 接总线
  • 从片的 $\rm CAS0$ - $\rm CAS2$ 连主片 (3 位, 能够表示 8 个数)

初始化命令字 ICW3:

  • 主片初始化命令字 ICW3, set $i$ 表示 $\rm IRi$ 接的是从片;
  • 从片初始化命令字 ICW3 的低 3 位写入二进制数字 i 表示接到了主片的 $\rm IRi$

级联中断请求和响应步骤:

  1. 从片通过 $\rm INT$ 发送请求, 到主片的 $\rm IRi$ 上 (可能有多个同时)
  2. 主片进行判优先级后, 选定优先级最高的一个 $\rm IRi$, 通过 $\rm INT$ 向 CPU 发送中断请求.
  3. CPU 准备好后, 通过 $\rm \overline{INTA}$ 发送两个负脉冲
  4. 主片接受到第一个负脉冲后, 设置 $\rm CAS0$ - $\rm CAS2$ 为 i, 表示应答 $\rm IRi$ 上的从片的请求
  5. 从片在接受到第一个负脉冲后, 检测 $\rm CAS0$ - $\rm CAS2$, 与 ICW3 低 3 位比较, 即可判断是否是响应自己的
  6. 如果是, 则向总线数据线 $\rm D$ 上写中断向量
  • 缓冲方式?
    • 缓冲方式: 数据线要加驱动
    • 非缓冲方式: 数据线不需要加驱动
  • 是否级联?
    • 否: 一般嵌套
    • 是: 主片特殊全嵌套, 从片一般嵌套
  • 允许嵌套?
    • 否: 自动 EOI 模式, 不需要写 EIO 命令
    • 是, 嵌套需要优先级?
      • 否: 特殊屏蔽方式 (特殊 EOI 模式)
      • 是: 一般屏蔽方式 (一般 EOI 模式)
        • 优先级模式?
          • 固定优先级
          • 自动循环优先级
          • 指定循环优先级
  1. 工作模式初始化: 写 ICW1, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = 1$, 规定请求上升沿有效 / 高电平有效, 是否级联 (是否需要写 ICW3), 是否需要写 ICW4;
  • $\rm D3 = 1$ 高电平, $\rm D3 = 0$ 上升沿
  • $\rm D1 = 1$ 单片, $\rm D1 = 0$ 级联
  • $\rm D0 = 1$ 要写 ICW4, $\rm D0 = 1$, 不写 ICW4, ICW4 = 0
  1. 顺序写 ICW2, 3, 4 (如果规定有), $\rm \overline{WR} = 0$, $\rm A0 = 1$
  2. 中断向量码初始化: 写 ICW2, $\rm D7$ - $\rm D3$ 表示中断向量码的高 5 位, 低 3 位为 $\rm IRi$, 即一片 8259 的 8 个中断请求中断向量连续
  3. 级联控制初始化: 写 ICW3. 主片 set bit 表示 $\rm IRi$ 接的是从片, 从片低 3 位表示接了主片的哪一个 $\rm IRi$
  4. 中断结束方式初始化: 写 ICW4
  • $\rm D4 = 1$ 特殊全嵌套 (级联主片), $\rm D4 = 0$ 一般全嵌套 (级联从片)
  • $\rm D3 = D2 = 0$, 非缓冲
  • $\rm D1 = 1$ 自动 EOI (不允许中断被打断嵌套), $\rm D1 = 0$ 非自动 EOI (允许中断被打断嵌套, 需要手动写 EOI 命令)
  • $\rm D0 = 1$
  1. 中断屏蔽字
  • 写 OCW1, $\rm \overline{WR} = 0$, $\rm A0 = 1$, 写入 OCW1 / IMR 中断屏蔽寄存器.
  • 读 OCW1 / IMR, $\rm \overline{RD} = 0$, $\rm A0 = 1$, 读出 OCW1 / IMR.
  1. 中断结束和优先级循环: 写 OCW2, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = D3 = 0$
  • 高三位: $\rm 001$ 一般 EOI 命令
  • 高三位: $\rm 011$ 特殊 EOI 命令 (用于没有优先级的嵌套), 低三位指定清除 ISR 的哪一位
  1. 屏蔽方式, 写 OCW3, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = 0, D3 = 1$
  • $\rm D6D5 = 00$: 非特殊屏蔽方式
  1. 读出控制字, 写 OCW3, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = 0, D3 = 1$, $\rm D1 = 1$
  • $\rm D0 = 0$: 读 IRR
  • $\rm D0 = 1$: 读 ISR
  • 接着读, $\rm \overline{RD} = 0$ 地址 $\rm A0 = 0$, 即可读出刚刚指定的 IRR / ISR

直接写, 略

用 DOS 的功能调用:

1
2
3
4
5
6
mov ah, 25H           ; DOS 25H 号功能调用
mov al, int_vec       ; 中断向量
mov dx seg handler    ; ds:dx 放中断处理程序地址
mov ds, dx            ; ds 要用 dx 赋值
mov dx offset handler
int 21H               ; 调用 DOS 功能调用

第 7 章

可编程并行接口, 是一个接口, 可以连接外设和 CPU / 总线

  • $\rm PA0$ - $\rm PA7$: 外设接口数据, A 口
  • $\rm PB0$ - $\rm PB7$: 外设 B 口
  • $\rm PC0$ - $\rm PC0$: 外设 C 口
  • $\rm D$: 接总线数据
  • $\rm \overline{RD}, \overline{WR}$: 读, 写
  • $\rm A0, A1$: 接口地址线
  • $\rm RESET$: 复位信号, 连 CPU 复位信号即可
  • $\rm \overline{CS}$: 片选

貌似只考方式 0, 无条件输入输出, 输用入三态门 (74LS244), 输出用锁存器 (74LS273).

地址线意义, $\rm A1A0 =$

  • $\rm 00$: 读 / 写 A 口
  • $\rm 01$: 读 / 写 B 口
  • $\rm 10$: 读 / 写 C 口
  • $\rm 11$: 配置 A, B, C 口的工作方式, 或者设置 PC 的值
    • $\rm D7 = 1$, 配置工作方式
      • $\rm D6D5$ 配置 A 口工作方式, $\rm 0$ 方式 0, $\rm 1$ 方式 1, $\rm 2$ 或者 $\rm 3$ 方式 2
      • $\rm D4$ 配置 A 口输入 / 输出, $\rm 0$ 输出, $\rm 1$ 输入
      • $\rm D3$ 配置 C 口高 4 位输入 / 输出
      • $\rm D2$ 配置 B 口工作方式, 0 / 1
      • $\rm D1$ 配置 B 口输入 / 输出
      • $\rm D0$ 配置 C 口低 4 位输入 / 输出
    • $\rm D7 = 0$, 设置 $\rm PC_{D3D2D1} = D0$

A 口可以工作方式 0, 1, 2; B 口可以工作方式 0, 1; C 口只能工作方式 0. C 口高低 4 位可以分开配置, 主要是配合 A, B 口的方式 1 / 2. (不细说, 反正不考)

可编程定时器, 内部有三个计数器, 每个计数器有三个 16 位的寄存器, 一个是初值, 一个是计数, 一个是用来读的.

  • $\rm CLK_i$: 接时钟

  • $\rm GATE_i$: 启动信号

  • $\rm OUT_i$: 输出

  • $\rm D7$ - $\rm D0$: 数据线, 连总线数据线

  • $\rm A1, A0$: 地址线

  • $\rm \overline{RD}, \overline{WR}$: 读, 写

  • $\rm \overline{CS}$: 片选

每个计数器 3 个 16 位寄存器, 初值只写, 锁存寄存器只读, 计数不可访问, 所以每个计数器只占用一个接口地址

还有一个控制字寄存器, 用来配置工作方式, 只写

$\rm A1A0 =$

  1. $\rm 00$: 计数器 0
  2. $\rm 01$: 计数器 1
  3. $\rm 10$: 计数器 2
  4. $\rm 11$: 控制字
  • 方式 0, 1
    • 开始计数, 输出低电平; 时间到, 输出高电平
    1. 写入计数初值时就开始计数, GATE 低电平暂停计数, 高电平允许计数
    2. GATE 上升沿时开始 / 重新计数 (需要时钟同步)
  • 方式 2, 3
    • 产生周期变化的波形, 周期为计数初值, 都是高电平先
    • GATE 高电平允许计数, 低电平禁止计数, 上升沿重新计数
    1. 时间到时, 产生一个负脉冲 (计数周期中的最后一个时钟周期低电平)
    2. 产生宽度相同的方波 (计数初值偶数), 计数初值奇数时, 高电平比低电平多一个时钟周期
  • 方式 4, 5
    • 隔 计数初值 个时钟周期后, 产生一个负脉冲
    1. 写入计数初值时就开时, GATE 低电平暂停计数, 高电平允许计数
    2. GATE 上升沿时开始 / 重新计数

时钟周期: 下降沿开始到下一个下降沿

  • $\rm D7D6$: 计数器选择
  • $\rm D5D4$:
    • $\rm 00$: 将计数器值锁存到锁存寄存器中, 以供读取
    • $\rm 01$: 选择计数器的低 8 位读 / 写 (读写的是不同的寄存器, 但是由于一个只读一个只写, 所以不需要额外用一位指定是读还是写)
    • $\rm 10$: 选择计数器的高 8 位读 / 写
    • $\rm 11$: 两次读写, 第一次低 8 位, 第二次高 8 位
  • $\rm D3D2D1$: 工作方式
  • $\rm D0$: 0 二进制计数, 1 BCD 计数