回路図です。
ここら辺りから難しくなってくる感じでした。
プログラムも長くなってきてます。SW3が新たに付け加わりました。
ちょっとここはハマりました。
なのでメモを残しておきます。
まず、ピン割込みを有効にするには、ユーザーマニュアルに記載してある通り、表30のbit6をEnableにして、クロックと割込みをゆうこうにしなければならないようです。しかし、このbit6リセット値がデフォルトで1なようです。
ペリフェラルリセットコントールレジスタというのがあり、このレジスタのbit10にGPIOとGPIO割込みリセットコントロールがあります。これを1にしないと動作可能ならないとマニュアには書いてあります。0でリセットして1でリセットをクリアし動作可能状態になるようです。(リセットをクリアするっていう表現がなんだかわかりにくい)
NVICの割込みベクタテーブル24番~31番にPin割込みが定義されており、これがPINT0~PINT7(全8本)がある。これはおそらくPIO0_nからPIO0_nのグループ分けのようなイメージ。これを踏まえれば参考本の図80は理解できると思います。
先のグループのどのPIN番号からの割込みなのかを判別するのがピン割込みセレクトレジスタ(Pin interrupt select register)。LPC810はピン数が少ないから結局、PINT0の設定で、ピン番号を具体的にこのレジスタで設定するイメージのよう。ちなみに、ピン番号というのは実際の物理的マイコンの足ピン番号ではなくて、PIO0_nのnの番号のこと。だから、PIO0_1はマイコン足ピン番号でいうと5番になるので注意。
![]()
この理解に苦しみました。一度理解してしまえばなんてことはないのですが、ユーザーマニュアルの説明だけだと理解しにくかったです。
改めてまとめるとLPC810は,NVICのベクタテーブルにピン割込みに対応する割込み番号24~31の8レジスタ存在する(PINT0_IRQHandler()~PINT7_IRQHandler()が使用できる)。
ピン割込みに使用できるIOはマニュアルでは。PIO0_0~PIO0_17までですが、LPC810は、実際にI/Oとして存在するのがPIO0_0~PIO0_5までしか存在しないのでPINTSEL[]に設定する値自体は0~5までしかありえません。
ここでPINTSEL[]に何番を使用するかですが、PINTSEL[0]~PINTSEL[7]までどれでも使用できます。
例えば、IRQ番号31番を使用して、PIO0_1をピン割込みに使用したいなら、以下のように設定すれば割込みがかかります。
もちろん、使用する割込み関数は、void PININT7_IRQHandler(void)です。
I/Oに値を設定したり、読み出したりするのに毎回ビットシフトを市よ応して読み出すようなプログラムが今回参考にしている本やトランジスタ技術の記事では紹介されておりますが、私自身この記述方法がかなり分かりに杭と感じており、なんか他に良い記述方法がないかと思っておりましたが、こんなレジスタがあるようです。
![]()