[Maixpy3]GPIO使用詳解


前言

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:上升沿觸發

等待更新...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM