オースティンとイゴールの回答は十分詳細です。しかし、私は別の方法で答えたいと思います。多分あなたはそれが役に立つと思うでしょう。
LPC11xx(Cortex-M0)のGPIOピンには4つのレベルがあり、GPIO0.0からGPIO0.nまでのすべてのピンは同じ割り込み番号を共有し、GPIO3.0からGPIO3.mまでのすべてのピンは同じ割り込み番号を共有します。
LPC11xxでGPIO割り込みを初期化するには6つのステップがあります
- ピン接続ブロックレジスタを変更して、ピン機能を設定します。
- GPIOデータ方向レジスタを変更してピン方向を設定します(デフォルト値は入力です)。
- 個別のピンごとに割り込みをセットアップします。GPIO割り込みマスクレジスタGPIOnIEに移動して、ビット(ピンに対応する)を論理1に設定する必要があります。
- GPIO割り込みセンスレジスタGPIOnIBEおよびGPIOnISを変更して、立ち上がりエッジまたは立ち下がりエッジ、あるいはその両方の割り込みをセットアップします。
- CMSIS関数を使用して、ネストされたベクトル割り込み制御でPIO_0 / PIO_1 / PIO_2 / PIO_3のいずれかの割り込みソースを有効にします。
- CMSIS関数を使用して割り込み優先順位を設定します。
コードの実装。2つの関数が必要です。1つは上記の6つのステップを初期化し、もう1つは割り込みハンドラーです。これは、スタートアップコードstartup_LPC11xx.s
ファイルで定義されているハンドラーと同じ名前にする必要があります。名前はPIOINT0_IRQHandler
〜PIOINT3_IRQHandler
です。別の名前を使用する場合は、起動ファイルの名前を変更する必要があります。
/*Init the GPIO pin for interrupt control */
void GPIO_Init(){
LPC_IOCON-> =.. //Pin configuration register
LPC_GPIO1->FIODIR = ... //GPIO Data direction register
LPC_GPIO1->FIOMASK = .. //GPIO Data mask register - choose the right pin
LPC_GPIO1->GPIOnIE = .. //Set up falling or rising edge
NVIC_EnableIRQ(PIO_1); //Call API to enable interrupt in NVIC
NVIC_SetPriority(PriorityN); //Set priority if needed
}
/*Must have the same name as listed in start-up file startup_LPC11xx.s */
void PIOINT1_IRQHandler(void){
//Do something here
}