《深入x86的内存寻址》I/O 外设硬件开发举例一

本文是原文《 深入x86的内存寻址》I/O 寻址的充部分,提供PC主机蜂鸣器的细节及乐声编程,代码可以作为第三方软件包作二次开发,任君耍玩,紧接的色条就是文字内,可以拷贝使用。代码附件下载: PC/XT 8253计数器PIT 芯片乐音开发应用

硬件开发举例一IBM PC/XT系统中8253的计数器是一种 Programmable Interval Timer (PIT) 芯片,改进型号为8254。它使用5v电源,有3个16位的独立计数器,有6种工作方式,已经作为PC标准的外设集成在系统中,即称为系统定时器 System Timer。它支持二进制或十进制 BCD 计数,计数频率为2MHz,改进型可高达10MHz,所有引脚电平和晶体管-晶体管集成电路 Transistor-Transistor Logic (TTL) 兼容。在现代的计算机主板上已经看不到 8254 这样小的芯片了,因集成电路高速发展,像 8253 这样的小集成电路已经统一整合成为计算机主板上桥接芯片中,但它的功能被保持了下来。芯片在计算机系统中主要有几个方面的作用: 计数器0作为系统计时器,用于产生时钟信号,用它完成日时钟计数。CLK 0 输人为 1.1931816MHz 方波,工作于方式3,计数初值为 0,输出信号 OUT 0 接到中断控制器 8259A 的 IRQ0 作为中断请求输入线。OUT 0 输出的方波脉冲分频后频率为 F0=1.1931816/216MHz=18.2Hz。即计数器0中断频率为每秒18.2次,计满1h需要中断次数 18.2*60*60=65520,24h需中断次 1573040次(0x001800BO),计满后双字复位清0,重新计数。 计数器1作为动态存储器定时刷新控制,CLK 1 接 1.1931816MHz的方波脉冲,工作于方式2,计数初值为18(0012H),OUTl输出的负脉冲脉宽为 1÷1.1931816MHz=838ns,其周期为18÷1.1931816MHz= 15.08 us,即每隔15.08us产生一个正脉冲,作为DMAC8237A的0通道的请求信号DREQ0,定时地对系统的动态存储器芯片进行一次刷新操作。 计数器2作为蜂鸣器音频发生器,工作在 MODE 3 为系统机箱内的蜂鸣器提供方波音频信号,经过 75477 放大后驱动蜂鸣器,作为机器的报警信号或伴音信号。GATE2接并行通信芯片8255的PB0,用它控制计数器2的计数过程。输出OUT2经过一个与门,这个与门受PB1控制,所以,扬声器由并行通信芯片来控制发声。 另外,通过编程还可对计数器2重新进行初始化,用于乐曲演奏等。由硬件连接电路可以看出,要使8253的片选信号CS有效,应使系统地址总线的A9A8A7A6A5=00010B,由于A4A3A2未参与译码,因此8253的端口基址为0x40,若取A4A3A2=000,则8253计数器0、计数器1、计数器2以及控制寄存器的端口地址分别为0x40、0x41、0x42和0x43。通过系统信息也可以得到此 PIT 设备的端口号为 0x0040 - 0x0043,对应计数器0~2还有控制寄存器,其实这些端口的定义都是传统约定而成的。 芯片的工作脉冲逻辑可以查找 Datasheet 文件,这是介绍其 6 种工作模式,各模式下的 GATE 信号作用如表所示。因为电路连接关系,要使用 MODE 0 要求使用计数器 0 来进行计数;MODE 1 和 MODE 2 等要求使用计数器2。 模式 低电平 低跳变 正跳变 高电平 0 停止计数 ○ 开始计数 1 ○ 初始化计数及 下一个时钟重置输出 ○ 2 停止计数 输出高电平 初始化计数及 重新装入计数器 开始计数 3 停止计数 同上 开始计数 4 停止计数 ○ 开始计数 5 ○ 初始化计数 ○ GATE 信号在各模式下的作用 MODE 0 计数结束中断模式 Interupt on Terminal Count 写入控制字初始化 OUT0 输出低电平,设置好 16-bit 计数初始值后开始计数,直到计数溢出即计满时产生高电平引发中断夜静请求。写入初始计数值低 8-bit 时会打断正在进行的计数,写入高 8-bit 数据时开始计数。 MODE 1 可编程单脉冲模式 Programmable One-Shot 写入计数初始值,然后通过 GATE 输入脉冲的上升沿 Rising Edge 来激发计数,直到计数结束时输出端产生高电平。计数过程中可以通过 GATE 的来重新激发计数而不会影响输出,读取数据也是。因此计数过程中,写入数据是无效的。 MODE 2 分频器模式 Rate Generator 输 入方波与设置值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值