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 は、次のコードで 1 回だけ発生します。

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;

BUZZER_PIN に設定した直後に、IOSET の値が変化しているので、私には奇妙に見えます。それで、それは何をすることができますか?

もう 1 つ質問があります。ブザーを使って何かできることはありますか? たとえば、ボリュームに変更しますか?もちろん、一時停止(time)とsetBuzzer(0)よりもsetBuzzer(1)で音の長さを調整できます。

4

1 に答える 1

1

どこかに、IOSET IOCLR などの #define を含むインクルード ファイルがあります。

通常、これらは GPIO レジスタ アドレスにマップされます。たとえば、次のようになります。

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

通常、IOSET は書き込み可能なアドレスであり、書き込まれたすべてのビットを 1 に設定できるハードウェア機能を備えていますが、残りの GPIO ビットは以前の状態のままにします。これにより、読み取り/変更/書き込み操作が不要になるため、割り込み/スレッドがより使いやすくなります。通常、他の状態に影響を与えることなく、引数に設定されている GPIO ポートのビットをクリアできる同様の「IOCLR」パートナーがあります。

ポート レジスタ自体は、おそらく 'IOPIN' などと呼ばれます。IOPIN を使用してビットの 1 つまたはサブセットを直接変更するには、読み取り/変更/書き込みが必要です:(

ブザーは 1 つの GPIO ピンに接続されているように見えるため、オンとオフを切り替えることしかできず、より細かい制御はできません。

于 2012-11-05T14:46:05.520 に答える