第十二章 跑馬燈實驗
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控制板載的雙色LED閃爍,以實現跑馬燈的效果。透過本章的學習,讀者將學習到在CanMV下控制Kendryte K210的GPIO輸出高低電平。
本章分為如下幾個小節:
12.1 maix.GPIO模組介紹
12.2 硬體設計
12.3 程式設計
12.4 執行驗證
12.1 maix.GPIO模組介紹
Kendryte K210上有兩種GPIO(General-purpose input/output,通用輸入/輸出),分別為GPIOHS(高速GPIO)和GPIO(通用GPIO)。
GPIOHS一共有32個,其特點如下所示:
- 可配置輸入輸出訊號
- 每個IO具有獨立的中斷源
- 中斷支援邊緣觸發和電平觸發
- 每個IO可以分配到FPIOA上48個管腳之一
- 可配置上下拉,或者高阻
GPIO一共有8個,其特點如下所示: - 可配置輸入輸出訊號
- 8個IO使用一箇中斷源
- 可配置觸發IO總中斷,邊沿觸發和電平觸發
- 每個IO可以分配到FPIOA上48個管腳之一
- 可配置上下拉,或者高阻
在CanMV中可以使用CanMV提供的maix.GPIO模組操作Kendryte K210上的GPIOHS和GPIO。maix.GPIO模組可以配置GPIOHS和GPIO的輸入輸出模式、設定和獲取輸入輸出值、使能並配置和關閉中斷。下面介紹maix.GPIO模組的功能。
maix.GPIO模組中提供了一些常量,這些常用可以用於模組類函式和方法的傳參,如下表所示:
表12.1.1 maix.GPIO模組常量
maix.GPIO模組提供了GPIO建構函式,用於建立一個GPIO物件,GPIO建構函式如下所示:
class GPIO(id, mode=None, pull=None, value=None)
透過GPIO建構函式可以透過指定引數建立一個GPIO物件。
id指的是GPIO編號。
mode可以指定GPIO的輸入輸出模式。
pull可以指定GPIO的上下拉模式。
value可以設定GPIO的初始輸出電平。
GPIO建構函式的使用示例如下所示:
from maix import GPIO
gpiohs0 = GPIO(GPIO.GPIOHS0, mode=GPIO.OUT, pull=GPIO.PULL_NONE, value=0)
maix.GPIO模組為GPIO物件提供了init()方法,用於初始化GPIO物件的引數,init()方法如下所示:
GPIO.init(mode=None, pull=None, value=None)
init()方法用於初始化GPIO物件的輸入輸出模式、上下拉模式和初識輸出電平,當然,也可以在構造GPIO物件的時候進行初始化。
init()方法的使用示例如下所示:
from maix import GPIO
gpiohs0 = GPIO(GPIO.GPIOHS0)
gpiohs0.init(mode=GPIO.OUT, pull=GPIO.PULL_NONE, value=0)
maix.GPIO模組為GPIO物件提供了value()方法,value()方法如下所示:
GPIO.value([value])
value為可選引數,當value引數不為空時,value()方法將設定GPIO物件輸出value指定的電平,當value引數為空時,value()方法將獲取並返回GPIO物件的電平狀態。
value()方法的使用示例如下所示:
from maix import GPIO
gpiohs0 = GPIO(GPIO.GPIOHS0, mode=GPIO.OUT, pull=GPIO.PULL_NONE, value=0)
gpiohs0.value(1)
value = gpiohs0.value()
maix.GPIO為GPIO物件提供了mode()方法,mode()方法如下所示:
GPIO.mode(mode=-1)
mode()方法用於配置GPIO物件的輸入輸出模式或上下拉模式,當然,也可以在構造GPIO物件的時候進行配置。
mode()方法的使用示例如下所示:
from maix import GPIO
gpiohs0 = GPIO(GPIO.GPIOHS0, mode=GPIO.OUT, pull=GPIO.PULL_NONE, value=0)
gpiohs0.mode(GPIO.IN)
gpiohs0.mode(GPIO.PUll_UP)
maix.GPIO為GPIO物件提供了irq()方法,irq()方法如下所示:
GPIO.irq(handler=None, trigger=GPIO.IRQ_BOTH, wake=None, priority=7)
irq()方法用於配置GPIO物件的中斷,可以配置GPIO物件的中斷處理函式、中斷觸發方式、中斷優先等級等引數。
irq()方法的使用示例如下所示:
from maix import GPIO
def gpio_irq_handler(gpio):
print('Hello', gpio)
gpiohs0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_PU)
gpiohs0.irq(gpio_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)
maix.GPIO為GPIO物件提供了disirq()方法,disirq()方法如下所示:
GPIO.disirq()
disirq()方法用於關閉GPIO物件的中斷。
disirq()方法的使用示例如下所示:
from maix import GPIO
def gpio_irq_handler(gpio):
print('Hello', gpio)
gpiohs0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_PU)
gpiohs0.irq(gpio_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)
gpiohs0.disirq()
12.2 硬體設計
12.2.1 例程功能
- 控制板載雙色LED輪流閃爍,實現跑馬燈的效果
12.2.2 硬體資源 - 雙色LED
LEDR - IO24
LEDB - IO25
12.2.3 原理圖
本章實驗內容,需要控制板載雙色LED輪流閃爍,以實現跑馬燈的效果,正點原子DNK210開發板上雙色LED的連線原理圖,如下圖所示:
圖12.2.3.1 雙色LED連線原理圖
透過以上原理圖可以看出,雙色LED中紅色和藍色LED對應的IO編號分別為IO24和IO25,且都是當IO輸出低電平時LED亮起,當IO輸出高電平時LED熄滅。
12.3 程式設計
12.3.1 maix.GPIO模組
有關maix.GPIO模組的介紹,請見第12.1小節《maix.GPIO模組介紹》。
12.3.2 程式流程圖
圖12.3.2.1 跑馬燈實驗流程圖
12.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:
from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
# 為LED連線的IO註冊GPIO功能
fm.register(board_info.LEDR, fm.fpioa.GPIO0)
fm.register(board_info.LEDB, fm.fpioa.GPIO1)
# 構造GPIO物件
ledr = GPIO(GPIO.GPIO0, mode=GPIO.OUT, pull=GPIO.PULL_NONE, value=1)
ledb = GPIO(GPIO.GPIO1, mode=GPIO.OUT, pull=GPIO.PULL_NONE, value=1)
while True:
# 設定LED對應的GPIO物件輸出對應的高低電平
ledr.value(0)
ledb.value(1)
time.sleep_ms(200)
ledr.value(1)
ledb.value(0)
time.sleep_ms(200)
可以看到,首先透過fm.register()方法為控制雙色LED的兩個IO分別分配了GPIO0和GPIO1的功能,然後透過GPIO建構函式構造了兩個GPIO物件,並均配置為輸出模式,最後在一個迴圈中輪流設定這兩個GPIO物件輸出不同的高低電平並延時一段時間,從而應該能看到板載的雙色LED輪流亮起、熄滅,實現跑馬燈的效果。
12.4 執行驗證
將DNK210開發板連線CanMV IDE,並點選CanMV IDE上的“開始(執行指令碼)”按鈕後,可以看到板載的雙色LED輪流亮起、熄滅,實現跑馬燈的效果,這與理論推斷的結果一致。