前言
maix2 dock使用的是全志V831芯片,運行在linux系統上。使用gpio時,需要先按照linux的方式進行GPIO注冊,然后進行使用。本文將大致講解下基於python3的GPIO注冊使用流程,並大致講解下相關API,供大家使用更多功能。
文章參考:gpio接口是干什么的?gpio怎么用?
Linux通用GPIO驅動寫法與應用 - 雲+社區 - 騰訊雲 (tencent.com)
在Linux中控制GPIO | St.Lee的個人站 (stlee.tech)
Linux GPIO 驅動 (gpiolib)_StephenZhou-CSDN博客
例程參考:GitHub - sipeed/MaixPy3: MaixPy for Python3, let's play with edge AI easier!
API參考:Python gpiod | loliot
官方例程
import time
from maix import gpio
PH_BASE = 224 # "PH"
gpiochip1 = gpio.chip("gpiochip1")
led = gpiochip1.get_line((PH_BASE + 14)) # "PH14"
config = gpio.line_request()
config.request_type = gpio.line_request.DIRECTION_OUTPUT
led.request(config)
while led:
led.set_value(0)
time.sleep(0.1)
led.set_value(1)
time.sleep(0.1)
例程講解
1.PH_BASE:設置寄存器編號。GPIO編號計算公式:num=(n-1)x32+m,n為GPIO組號,m為pin號。例如PA(13)=(1-1)x32+13=13。為了方便使用,可以先設置寄存器編號,然后直接+Pin進行使用。
PH_BASE = 224 # "PH",(6-1)*32=224
led = gpiochip1.get_line((PH_BASE + 14)) # "PH14",224+14
2.gpio.chip():實例化gpio_chip 結構體。通常在硬件上,一個芯片對 IO 口來說,分為了很多個 Bank,每個 Bank 分為了 N 組 GPIO。gpio_chip 是對一個 Bank 的 GPIO 的硬件的具體抽象。在maixii中,統一由gpiochip1進行管理。
3.chip.get_line():在給定的偏移地址,通過此芯片暴露該線。即將該地址上的GPIO暴露出來,未暴露的GPIO無法使用。
4.gpio.line_request():實例化line_request 結構體,該結構體中包含了GPIO的使用方法,例如:
DIRECTION_INPUT:輸入模式
DIRECTION_OUTPUT:輸出模式
5.config.request_type():設置GPIO參數。更多參數請看。
6.led.request(config) :以config設置的參數向內核注冊GPIO。
7.led.set_value():設置GPIO點評,0/1可選。get_value()讀取GPIO電平。
常用API
chip:
1.get_line(self, offset: int):暴露一個GPIO地址線,即初始化一個GPIO。指向line結構體,然后即可調用line的api。
使用方法:
led = chip.get_line((PH_BASE + 14)) # "PH14"
led.set_value(0)
返回值:一個GPIO對象
2.get_lines(self, offsets: List[int]):暴露一組GPIO地址線。即同時初始化多個GPIO,指向line_bulf結構體。
使用方法:
led = chip.get_lines([(PH_BASE + 14),(PH_BASE + 15),(PH_BASE + 16)]) # "PH14","PH15","PH16"
for i in led:
print(i)
返回值:多個GPIO對象
3.get_all_lines(self):暴露所有GPIO地址線。即初始化所有GPIO
使用方法:
lb = chip.get_all_lines()
返回值:多個GPIO對象
line:
1.request(self, config: line_request, default_val: int = 0):向內核注冊該地址。line_request:GPIO 參數,使用config = line_request()進行設置;
default_val:默認電平,僅在輸出方式下有效
使用方法:
config = line_request()
config.request_type = line_request.DIRECTION_OUTPUT
# line.request(config)
line.request(config, 1)
返回值:無
2.release(self):釋放該地址線
使用方法:
line.release()
返回值:無
3.get_value(self):獲取該地址線的電平,0/1
使用方法:
print(line.get_value())
返回值:地址線電平
4.set_value(self):設置該地址線的電平,0/1
使用方法:
line.set_value(1)
返回值:無
5.event_wait(self, timeout: timedelta):等待該地址線活動
timeout:超時時間
使用方法:
print(line.event_wait(timedelta(seconds=1000)))
返回值:bool值
5.event_read(self):讀取該地址線活動
使用方法:
if line.event_wait(timedelta(seconds=10)):
event = line.event_read()
print(event.event_type == line_event.RISING_EDGE)
print(event.timestamp)
else:
print("Timeout")
返回值:event對象。
event.event_type:事件類型,RISING_EDGE|FAILING_EDGE
6.reset(self):重設該地址線的狀態
使用方法:
line.reset()
返回值:無
line_bulk:
1.append(self, new_line: line):向地址組添加新地址線。新line必須與地址組內其他lines同屬一個gpio_chip。
使用方法:
bulk.append(line1)
返回值:無
2.size(self) :獲取地址組內線數
使用方法:
print(bulk.size)
返回值:地址線數量
3.chear(self) :移除地址組內所有地址線
使用方法:
bulk.clear()
返回值:無
4.request(self, config: line_request, default_vals: Optional[List[int]] = None):向內核注冊該組地址。
使用方法:
config = line_request()
config.consumer = "Application"
config.request_type = line_request.DIRECTION_OUTPUT
# bulk.request(config)
bulk.request(config, [1] * bulk.size)
返回值:地址線數量
5.release(self):釋放該組地址線
使用方法:
bulk.release()
返回值:無
6.get_values(self):獲取該組地址線的電平,0/1
使用方法:
print(bulk.get_values())
返回值:地址線電平,數組
7.set_values(self, values: List[int]):設置該組地址線的電平,傳入數組
使用方法:
bulk.set_values([1] * bulk.size)
返回值:無
7.event_wait(self, timeout: timedelta):等待該地址組活動
使用方法:
ebulk = bulk.event_wait(timedelta(microseconds=20000))
返回值:發生活動的地址線。
常用常量
line_request:
1.DIRECTION_INPUT 輸出模式
2.DIRECTION_OUTPUT 輸入模式
3.EVENT_FALLING_EDGE:下降沿觸發
4.EVENT_RISING_EDGE:上升沿觸發
5.EVENT_BOTH_EDGES:同時觸發
line_event:
1.RISING_EDGE:下降沿觸發
2.FALLING_EDGE:上升沿觸發
等待更新...