什么是IOSET以及如何使用简单的蜂鸣器(BUZZER_PIN)?

时间:2012-11-05 14:38:53

标签: c io microcontroller

我有带蜂鸣器的微控制器的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)调整,而不是暂停(时间)和setBuzzer(0)。

1 个答案:

答案 0 :(得分:1)

在某处你会找到一个包含IOSET IOCLR等的#define的包含文件。

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

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

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

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

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