ボタン(IO)状態の読み取り

 

IOの読み出し

下記のコードが参考になります。

const uint32 u32btn_mask = ((1 << 9) | (1 << 10)); // DIO9,10を読み取り対象に。
uint32 u32read_io;

vAHI_DioSetDirection(u32btn_mask, 0); // IOを読み取りモードに
//vAHI_DioSetPullup(u32btn_mask, 0); // プルアップの設定(デフォルトで設定されている)
u32read_io = (u32AHI_DioReadInput() & u32btn_mask) ^ u32btn_mask;
              // ボタン押下時は LO になるのでXORでビット反転する。

※ 内部プルアップを設定していれば(デフォルト)、ボタンをIOに接続する際、プルアップ抵抗を省略できます。が、通常はプルアップ抵抗追加を推奨します。
※ u32read_io には読み取ったボタンのビットが設定されます。(DIO9なら 1<<9 のビットが立ちます)
※ チャタリングの考慮は別途行う必要があります。

割り込み

以下の例では DIO9, DIO10 の変化により割り込みハンドラーが呼び出されます。割り込みは E_AHI_DEVICE_SYSCTRL イベントとして伝えられます。

const uint32 u32btn_mask = ((1 << 9) | (1 << 10)); // DIO9,10

void vInitFunc() {
    ...
	vAHI_DioInterruptEnable(u32btn_mask, 0); // 割り込みの登録
}

/* AppQAPI による割り込み遅延実行のハンドラ */
PRIVATE void vProcessIncomingHwEvent(AppQApiHwInd_s *psAHI_Ind)
{
switch (psAHI_Ind->u32DeviceId) {
case E_AHI_DEVICE_SYSCTRL:
if (psAHI_Ind->u32ItemBitmap & u32btn_mask) {
... 割り込み源が指定したボタンであった ...
}
break;
}
}

※ 割り込みハンドラの詳細についてはタイマー割り込みを参照ください。

ウェイクアップ

スリープの起床に DIO の割り込みを利用できます。以下の例では、vDoSleep() がスリープ手続きを行っています。AppWarmStart の先頭(ウォームスタート直後)に u32AHI_DioWakeStatus() を用いれば、DIO割り込みによる起床かどうか判定できます。

const uint32 u32btn_mask = ((1 << 9) | (1 << 10)); // DIO9,10

void vDoSleep() {
	...
	
    // 事前に通常割り込みを禁止する
	vAHI_DioInterruptEnable(0, u32btn_mask); 
    
	...
    
    // 割り込みハンドラの登録
	vAHI_DioWakeEnable(u32btn_mask, 0);
 	vAHI_DioWakeEdge(0, u32btn_mask); // 立下り検出
 
    
    // 内蔵フラッシュの停止
    vAHI_FlashPowerDown();

    // スリープ
	vAHI_Sleep(E_AHI_SLEEP_OSCON_RAMON);
	
    // 他のコードが実行されないようにブロック
    while(1);
}

PUBLIC void AppWarmStart(void) {
	// 起床要因のチェック (u32AHI_Init の前に呼ぶ)
	if(u32AHI_DioWakeStatus() & u32btn_mask) {
    	// この場合、ボタンによる起床であった
    }

	// initialize AHI
	(void)u32AHI_Init();
    ...
}

※ 事前に通常の割り込みは禁止します。ほぼ同時に通常のDIO割り込みが発生しても何も実行しないようにします。
※ チャタリングの禁止などの処理を行う場合に必要な時計には、2系統ある wakeup timer のカウント値を利用することも出来ます。