我有带蜂鸣器的微控制器的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)来调整声音的持续时间,而不是使用stop(time)和setBuzzer(0)来调整声音的持续时间。

最佳答案

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

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

#定义FIO0DIR(*(易失性无符号长*)0x3FFFC000)

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

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

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

关于c - 什么是IOSET?简易蜂鸣器(BUZZER_PIN)的工作方式是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13234311/

10-10 10:58