LEDの制御に続いてプッシュボタンの読み込みを行ってみます。
EZ-KITのプッシュボタンはSW4からSW7の4つがPF8からPF11に接続されており、プログラムから読み込み可能です。今回はSW4(PF8)が押されているときにLED4(FLASH B PORTA 0)が点灯するプログラムを書きます。
PF8を入力にするためにFIOポートのビット8方向を入力にします。ADSP-2191の時にはこれだけで入力になったのですが、ADSP-BF533ではさらにビットを入力イネーブルにしなければ動作してくれません。何でやねん。
方向の設定はFIO_DIRレジスタで、入力イネーブルはFIO_INENレジスタで行います。
なお、必要ないのですが念のため全入力ピンを正論理入力に設定しておきます。
*mmr::pFIO_DIR &= 0xfeff; // PF8を入力に *mmr::pFIO_POLAR = 0; // 正論理入力 *mmr::pFIO_INEN |= 0x0100; // PF8入力イネーブル
FIOデータの読み込みはFIO_FLAG_Dレジスタから行います。このレジスタにはPFの状態がそのまま反映されています。SW4を押すとPF8に対応するビット8が1になります。
if ( *mmr::pFIO_FLAG_D & 0x0100 ) // スイッチは押されているか *pFLASHA_PORTB_OUT |= 0x0001; // 押されているならLED点灯 else *pFLASHA_PORTB_OUT &= 0xfffe; // 押されていないならLED消灯
こうして作ったプログラムを下に示します。前回のLED点灯プログラムが下敷きです。あっさりしたプログラムなので特に問題はないはずです。が、買ってきたEZ-KITで走らせてもLEDが消えたままでボタンに反応しません。
これはEZ-KITの工場出荷時設定ではPFピンとSWが切り離されているからです。EZ-KITのマニュアルを読んでも何がいいたいのかよくわからず、表の読み方も不明です。そこで回路図を読むとこのPFピンを他でも使えるようにスイッチの回路が切り離しできるような設計であることがわかります。回路図は偉大です。
プログラムを動かすにはEZ-KITのSW9-1をONにします。
#include<cppdefBF53x.h> // FLASH AのポートB設定レジスタ volatile unsigned char * const pFLASHA_PORTB_OUT=(volatile unsigned char *)0x20270005; volatile unsigned char * const pFLASHA_PORTB_DIR=(volatile unsigned char *)0x20270007; int main(void) { *mmr::pEBIU_AMBCTL0 = 0x7bb07bb0; // 非同期ポート0,1の初期化 *mmr::pEBIU_AMBCTL1 = 0x7bb07bb0; // 非同期ポート2,3の初期化 *mmr::pEBIU_AMGCTL = 0x000f; // 全非同期ポートをイネーブル *pFLASHA_PORTB_DIR = 0x3f; // bit0-5を出力に *pFLASHA_PORTB_OUT = 0x00; // LED消灯 *mmr::pFIO_DIR &= 0xfeff; // PF8を入力に *mmr::pFIO_POLAR = 0; // 正論理入力 *mmr::pFIO_INEN |= 0x0100; // PF8入力イネーブル while(1) if ( *mmr::pFIO_FLAG_D & 0x0100 ) // スイッチは押されているか *pFLASHA_PORTB_OUT |= 0x0001; // 押されているならLED点灯 else *pFLASHA_PORTB_OUT &= 0xfffe; // 押されていないならLED消灯 }