Ameba Arduino: [RTL8722CSM] [RTL8722DM] [RTL8722DM MINI] GPIO - 使用GPIO Interrupt控制LED

材料準備

  • AmebaD [RTL8722DM / RTL8722CSM / RTL8722DM MINI] x 1
  • LED x 1
  • Button x 1

範例說明

這個範例裡,我們使用按鈕與LED。一開始LED是亮的,當我們按下按鈕並放開之後,LED變暗。再按下按鈕之後,LED變亮。

相比較於Arduino的入門的範例 “按鈕與LED”,不一樣的地方是,Arduino的範例是按著按鈕,LED才亮著,放開按鈕,LED才熄滅。

我們打開範例程式, “Files” -> “Examples” -> “AmebaGPIO” -> “LED_InterruptCtrl”。

RTL8722DM / RTL8722CSM 接線如下圖:

1

RTL8722DM MINI 接線如下圖:

1

編譯程式並上傳到Ameba完成之後,按下Reset按鈕。
一開始LED是亮的,當我們按下Pin 12的按鈕並放開,LED變暗,再按一次,LED變亮

程式碼說明

setup()

裡面我們將Pin 12的按鈕設定成

 INPUT_IRQ_RISE

,代表當這根pin的電壓遇到GND變成3V3的情況會觸發Interrupt。所以我們將按鈕一端接在3V3,按下按鈕時3V3會連通而觸發interrupt。

pinMode(button, INPUT_IRQ_RISE);

我們也可以設定成

INPUT_IRQ_FALL

,代表遇到pin的電壓遇到3V3變成GND會觸發Interrupt。這種情況裡,按鈕另一端通常會接在GND
設定完pin mode之後,再設定要處理interrupt的function:

digitalSetIrqHandler(button, button_handler);

其中第二個參數是function pointer,它的prototype是:

void button_handler(uint32_t id, uint32_t event)

所以我們在這個handler裡面處理interrupt,每按一次按鈕(並放開)會觸發一次中斷,我們就改變LED狀態。

NOTE:如果發現按下按鈕LED的狀態沒變,或是LED閃了一下又恢復成原本的狀態,通常是因為人的手指相較於IC不夠靈敏,所以雖然我們覺得只按了一次,實際上輕微的抖動IC都認的出來,並且實際上是觸發了兩次interrupt
Copyrights ©瑞晟微电子(苏州)有限公司 2021. All rights reserved.
請先確認已安裝QQ通訊軟體