LPC1343 GPIO割り込み処理 (Interrupt)

出来た事

GPIOの割り込み処理

-.GPIOをスイッチにしてLPC expressoのLEDをON-OFFさせる

開発Listへ戻る

久方ぶりにLPC1343 expressoを動かす意欲がわいてきました。
かなりのブランクなので、且つもともとC言語も良くわかってないので
感覚をつかむまで時間がかかりました。

今回は、LPC1343 expresso基板のLED (LED2 PIO0_7についてるやつ)を
GPIOをスイッチにしてON-OFFさせてみようと思います。

こんなイメージ

スイッチに使用するGPIOはPIO3.3にしました。理由はGNDに近いからです。

あとはexample codeを利用して作成です。
example codeはココのサイトから入手可能です。
LPC1300の部分の 

□サンプルコード/ LPCXpresso LPC1343
CMSIS 1.3 + ペリファラル・ドライバ。

ってやつをダウンロードしてZIP解凍後に
GPIOフォルダ→srcフォルダと開いていけば
中にgpio.c, gpio.h, gpiotest.cが見つかります。

gpio.c, gpio.hをプロジェクトのsrcフォルダにドラッグアンドドロップします。

であとはmain.cを以下のようにすればOK!

コード

#ifdef __USE_CMSIS
#include "LPC13xx.h"
#endif

#include
#include
#include "gpio.h"
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

int main(void) {

GPIOInit();

GPIOSetDir( PORT0, 7, 1 ); // LED pin as output
GPIOSetValue( PORT0, 7, 0 );

LPC_IOCON->PIO3_3 = 0xd0; // Default setting = Pull up
GPIOSetDir( PORT3, 3, 0 );/* use port3_3 as input event, interrupt test. */

GPIOSetInterrupt( PORT3, 3, 0, 0,1 );/* port3_3, single edge trigger, active high. */
GPIOIntEnable( PORT3, 3 );

// Enter an infinite loop, just incrementing a counter
volatile static int i = 0 ;
while(1) {i++ ;}
return 0 ;
}


void PIOINT3_IRQHandler(void){
uint32_t regVal;

regVal = GPIOIntStatus( PORT3, 3 );
if ( regVal )
{
GPIOIntClear( PORT3, 3 );
}

LPC_GPIO0->DATA ^=0x80;
return;
}

解説

example codeの関数をふんだんにつかっています。

まずイニシャライズ
GPIOInit();
gpio.c内に入っているのですが見てみると
GPIO部のclockと割り込みを有効にしているだけです。


次はLED pinの出力設定と初期設定
GPIOSetDir( PORT0, 7, 1 ); // LED pin as output
GPIOSetValue( PORT0, 7, 0 );
2つの関数はgpio.hに入っています。
port番号とpioの番号を指定して、入出力の設定、出力の場合の値設定ができます。
汎用化されていて使いやすいです。

スイッチ用(割り込み用)の信号設定です。
LPC_IOCON->PIO3_3 = 0xd0; // Default setting = Pull up
GPIOSetDir( PORT3, 3, 0 );/* use port3_3 as input event, interrupt test. */
PIO3_3を使用します。
デフォルトでプルアップなのですが、一応設定しておいたのと
入力に設定しています。

割り込みの設定です。
GPIOSetInterrupt( PORT3, 3, 0, 0,1 );/* port3_3, single edge trigger, active high. */
GPIOIntEnable( PORT3, 3 );

PIO3_3の割り込み設定をsingle edgeで rigingにしています。
カッコ内のPORT3,3 の後が Edge割り込みなのかLevel割り込み(=1)なのか?
次が、Single edgeかDouble edge(=1)か?
最後がActive Low or High(=1)です
そしてPIO3_3の割り込みを有効にしています。

これで設定は終わりで、
次は割り込みが入ったときの動作記載です。
void PIOINT3_IRQHandler(void){
この関数もgpio.cの中に記載されています。(無効化されています)

次は割り込みのステータスを確認して、割り込みのフラグをClearしています。
今回はPIO3_3だけしか使っていないのでステータスの確認は不要としても
良いと思いますが2本以上割り込みを使う場合、
たとえばPIO3_3,PIO3_2の2本を使う場合、PIO3_3の割り込みもPIO3_2の
割り込みも発生したら同じ PIOINT3_IRQHandler関数に飛びますので
どちらの割り込みなのかを判別する必要が発生します。
今回使用したサンプルコードはそのようなことを想定していると思います。
なおClearを忘れると、ずっと割り込み状態になるので注意!
regVal = GPIOIntStatus( PORT3, 3 );
if ( regVal )
{
GPIOIntClear( PORT3, 3 );
}

最後にLEDの出力を反転させて終わりです。
LPC_GPIO0->DATA ^=0x80;