第十五章 按鍵中斷實驗
1)實驗平臺:正點原子DNK210開發板
2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0
3)購買連結:https://detail.tmall.com/item.htm?&id=782801398750
4)全套實驗原始碼+手冊+影片下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html
5)正點原子官方B站:https://space.bilibili.com/394620890
6)正點原子K210技術交流企鵝群:605557868
本章實驗將介紹如何使用CanMV讓Kendryte K210透過中斷的方式獲取板載按鍵的狀態。透過本章的學習,讀者將學習到在CanMV下Kendryte K210的GPIO輸入中斷的使用。
本章分為如下幾個小節:
15.1 maix.GPIO模組介紹
15.2 硬體設計
15.3 程式設計
15.4 執行驗證
15.1 maix.GPIO模組介紹
有關maix.GPIO模組的介紹,請見第12.1小節《maix.GPIO模組介紹》。
15.2 硬體設計
15.2.1 例程功能
- 當KEY0按鍵被按下後,雙色LED的紅燈切換亮滅狀態
15.2.2 硬體資源
- 雙色LED
LEDR - IO24 - 獨立按鍵
KEY0按鍵 - IO18
15.2.3 原理圖
本章實驗內容,需要透過KEY0按鍵按下是產生的下降沿觸發GPIO的中斷,正點原子DNK210開發板上KEY0按鍵的連線原理圖,如下圖所示:
圖15.2.3.1 KEY0按鍵連線原理圖
透過以上原理圖可以看出,KEY0按鍵對應的IO編號為IO18,當KEY0按鍵被按下後,其對應IO的電平將變為低電平。
15.3 程式設計
15.3.1 maix.GPIO模組
有關maix.GPIO模組的介紹,請見第15.1小節《maix.GPIO模組介紹》。
15.3.2 程式流程圖
圖15.3.2.1 按鍵中斷實驗流程圖
15.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:
from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
# 為IO分配相應的硬體功能
fm.register(board_info.LEDR, fm.fpioa.GPIO0)
fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
# 構造GPIO物件
ledr = GPIO(GPIO.GPIO0, GPIO.OUT)
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
# 配置GPIO物件的中斷
def key_irq_handler(key):
global key0
global ledr
time.sleep_ms(20)
if key is key0 and key.value() == 0:
ledr.value(not ledr.value())
key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)
while True:
pass
可以看到,首先為使用到的IO分配相應的硬體功能,接著是構造GPIO物件,接著就是為KEY0按鍵對應GPIO物件配置中斷,在中斷服務函式key_irq_handler()中可以看到有一個20毫秒的延時,這是為了實現按鍵消抖,但不建議讀者在實際的應用中在中斷服務函式中新增延時,因為中斷服務函式的執行應該要儘可能的快,如果需要在中斷中執行比較耗時的事務,建議將該事務分為上下文進行執行,從而減少中斷服務函式執行的時間。
15.4 執行驗證
將DNK210開發板連線CanMV IDE,並點選CanMV IDE上的“開始(執行指令碼)”按鈕後,此時,若按下板載的KEY0按鍵,則能看到雙色LED的紅色LED切換了亮滅狀態,多次按下KEY0按鍵,雙色LED的紅色LED也將多次切換亮滅狀態,這與理論推斷的結果一致。