0

我有带蜂鸣器的微控制器的 c 代码。它有效,但我想知道它是如何工作的。在 wh.h/.cpp 我有这个功能:

void setBuzzer(tBool on)
{
  if (TRUE == on)
    IOCLR = BUZZER_PIN;
  else
    IOSET = BUZZER_PIN;
}

这可以启用和禁用蜂鸣器。我不知道它真正的作用是什么,BUZZER_PIN、IOCLR 和 IOSET 是什么?

BUZZER_PIN 在代码中只出现一次,在:

void immediateIoInit(void)
{
  tU8 initCommand[] = {0x12, 0x97, 0x80, 0x00, 0x40, 0x00, 0x14, 0x00, 0x00};
  //                                                         04 = LCD_RST# low
  //                                                         10 = BT_RST# low

  //make all key signals as inputs
  IODIR &= ~(KEYPIN_CENTER | KEYPIN_UP | KEYPIN_DOWN | KEYPIN_LEFT | KEYPIN_RIGHT);

  IODIR |= BUZZER_PIN;
  IOSET  = BUZZER_PIN;

  IODIR |= BACKLIGHT_PIN;
  IOSET  = BACKLIGHT_PIN;

我觉得这很奇怪,因为 IOSET 值在将其设置为 BUZZER_PIN 后就发生了变化。那么,这种方式能做什么呢?

还有一个问题:我可以用蜂鸣器做更多的事情吗?例如改变音量?当然,声音的持续时间可以用 setBuzzer(1) 调整,而不是 pause(time) 和 setBuzzer(0)。

4

1 回答 1

1

您会在某个地方找到包含 IOSET IOCLR 等的#define 的包含文件。

通常,它们映射到 GPIO 寄存器地址,例如:

#define FIO0DIR (*(volatile unsigned long *)0x3FFFC000)

IOSET 通常是一个可写地址,硬件能够将写入它的所有位设置为 1,而其余的 GPIO 位则保持之前的状态。这消除了对读/修改/写操作的需要,因此对中断/线程更加友好。它通常有一个类似的“IOCLR”伙伴,可以清除在其参数中设置的 GPIO 端口上的位,而不会影响其他人的状态。

端口寄存器本身可能被称为“IOPIN”或类似的名称。直接使用 IOPIN 修改一个位或位子集需要读取/修改/写入 :(

蜂鸣器似乎连接到一个 GPIO 引脚,因此您只能打开和关闭它 - 无法进行更精细的控制。

于 2012-11-05T14:46:05.520 回答