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