【WCE】使用 8253 定时器蜂鸣 (CEPC BSP)

来源:互联网 发布:淘宝最长收货时间 编辑:程序博客网 时间:2024/05/01 17:03

通过测试,我们发现 Windows CE 没有实现 Beep 函数,亦注意到 x86 嵌入式系统在运行 Windows XPe 时能通过调用 Beep 函数来驱动蜂鸣器蜂鸣。经过对 Beep 函数反向工程以及 8253 定时器蜂鸣原理的研究,我们相信在 Windows CE 下同样能够蜂鸣。

首先,讲解一下早期 PC 上的 8253 定时器蜂鸣原理:

图中 CLOCK 是时钟(fc=1,193,180 Hz);GATE2 是片选;OUT2 是输出引脚,用于调制声波;COUNT 是计数寄存器;CONTROL 是控制寄存器,各位定义如下:

Bits 7,6Channel ID (11 is illegal)Bits 5,4Read/load mode for two-byte count value: 00 -- latch count for reading 01 -- read/load high byte only 10 -- read/load low byte only 11 -- read/load low byte then high byteBits 3,2,1Count mode selection (000 to 101)Bit 00/1: Count in binary/BCD

根据 datasheet 可知 COUNT 寄存器决定了声波的频率,且符合公式:frequency = 1,193,180 / COUNT

考虑到当今的 x86 嵌入式系统仍保留了 8253 定时器的功能,我们使用 C/C++ 代码实现了 Beep 函数,代码如下:

BOOL Beep(DWORD dwFreq, DWORD dwDuration)
{
    _outp(
0x430xb6);    // 设置蜂鸣器
    _outp(0x42, LOBYTE(0x1234dc / dwFreq));    // 频率值 LSB
    _outp(0x42, HIBYTE(0x1234dc / dwFreq));    // 频率值 MSB
    _outp(0x61, _inp(0x61| 0x3);    // 开始蜂鸣

    Sleep(dwDuration);

    _outp(
0x61, _inp(0x61& 0xfc);    // 终止蜂鸣

    
return TRUE;
}

8253 Timer Chip http://dl2.csdn.net/down4/20070628/28234414647.pdf

原创粉丝点击