LPC810メモ:Pin interrupts

GPIOの入力の変化で割り込みを発生させるpin interruptsの例。
ボタンを押すと、LEDの点灯/消灯が切り替わるだけ。

前提とする環境はこちら→LPC810メモ 共通の準備

サンプルコード

#include "LPC8xx.h"

int main(void) {
    // UM10601 8.3 Basic configuration
    // に従った手順
    LPC_SYSCON->PINTSEL[0] = 0; // PIO0_0(8番pin)をpin interruptの0番に。
    // PINTSEL[7]まであって、それぞれ違う割り込みになる。
    // たとえば、
    // LPC_SYSCON->PINTSEL[3] = 2;
    // なら、PIO0_2(4番pin)をpin interruptの3番に、設定したことになる。

    // GPIOに対してclockを有効化(pin interruptと共通の6番)
    // UM10601 4.6.13 System clock control register
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

    // wake-upの設定は省略

    //  Pin interrupt 0の割り込み有効化。
    //  UM10601  3.3.1 Interrupt sources
    NVIC->ISER[0] = (0x1 << 24); // 0番だからbit24。7番(bit31)まである。

    //  UM10601 8.3 Basic configuration
    //  の手順、ここまで。

    // LED出力用に、PIO0_4(2番pin)をoutputに設定
    LPC_GPIO_PORT->DIR0 |= (1<<4);

    // Pin interrupt 0の割り込み、falling edgeに対して有効化
    // UM10601  8.6.6 Pin interrupt active level or falling edge interrupt set register
    LPC_PIN_INT->SIENF = (1 << 0);

    return 0 ;
}

extern "C" {
    // pin interrupt 0の割り込みハンドラ。
    // cr_startup_lpc8xx.cpp で定義されている名称。
    void PININT0_IRQHandler(void)
    {
        // 割り込みをクリア
        // pin interrupt 0の割り込みをクリア
        // UM10601 8.6.10 Pin interrupt status register
        LPC_PIN_INT->IST = (1<<0);

        // PIO0_4(2番pin)の出力反転
        LPC_GPIO_PORT->NOT0 |= (1<<4);
    }
}

接続

  • ボタンは8番pin、LEDは2番pin
  • ボタンを押して、離した瞬間(8番の入力がHIGH->HIGH、つまりfalling edge)に、2番の出力が反転して、LEDの点灯/消灯が入れ替わる

補足/雑感

  • falling edgeじゃなくてrising edge検出ならUM10601「8.6.2 Pin interrupt level or rising edge interrupt enable register」で有効化
  • なにか難しいものと勘違いして今まで試してなった。これと対になってるpattern match engineが複雑なので、pin interrupts自体は非常に簡単な機能だといまさら気づく。

みっかぼの無料Androidアプリはこちら。