中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在樹莓派3B上如何使用RPi.GPIO

發布時間:2021-11-20 09:36:56 來源:億速云 閱讀:201 作者:小新 欄目:互聯網科技

這篇文章主要介紹在樹莓派3B上如何使用RPi.GPIO,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一直都聽說樹莓派功能很強大,這幾天就買了個pi3試玩一下。拿到手裝好系統,就開始測試GPIO口,點亮一個LED。直接用python去操作GPIO好像不行,還好網上有很多python封裝包可以用。RPi.GPIO使用比較簡單,官方主頁也給比較詳細的介紹也附帶了例子。

RPi.GPIO主頁:https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/

RPi.GPIO是python調用包,提供了一些方法來操作樹莓派上GPIO引腳。使用python程序可以很方便的調用這些方法。目前RPi.GPIO提供了GPIO輸入、輸出和軟件模擬PWM方法,可惜的是暫不提供SPI、I2C、UART和硬件PWM方法。

使用不難,接下來我就來介紹下使用它的一些感受吧。

首先,既然是控制GPIO口,那就得看看它操作的速度了,雖然python是出了名的慢。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(35, GPIO.OUT)

start_time = time.time()
for i in range(0, 1000000):
    GPIO.output(35, 1)
    pass
end_time = time.time()

print(end_time - start_time)
GPIO.cleanup()

上面代碼我運行了五次,平均下來每次時間為2.4396s。然后去除GPIO.output(35, 1),運行五次,每次平均時間為0.5222s。有這些數據就可以計算出執行1000000次GPIO.output(35, 1)的時間為1.9174s,則每次執行GPIO.output(35, 1)時間是1.9us。我的個神啊太慢了吧,后面我又對輸出0和改成輸入模式,測試的時間都基本一樣,一個字“慢”。現在很多8位單片機都比這速度快了。估計用這速度去軟件模擬SPI、I2C傳大點的數據是不行了。本來還想模擬個SPI驅動下TFT顯示屏,看到這速度只能放棄了。

RPi.GPIO有個類似硬件中斷的函數,挺好玩的。

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(35, GPIO.IN, GPIO.PUD_DOWN)

def my_callback(channel):
    print('--my_callback start--')
    for i in range(0, 10000000):
        pass
    print('--my_callback end--')
GPIO.add_event_detect(35, GPIO.RISING, my_callback, bouncetime=200)

while True:
    time.sleep(1)
GPIO.cleanup()

GPIO.add_event_detect添加事件檢測,GPIO.RISING上升沿觸發,my_callback回調函數,它還有個防抖延時bouncetime(單位ms),省得我們自己去軟件防抖。為什么我要加for i in range(0, 10000000)呢?我是想知道當中斷被觸發后但還沒有退出來,再次給它個上升沿,它會不會再次進入回調函數呢?答案是不會。

硬件中的中斷有嵌套關系,需要給每個中斷設定優先級。51類的需設定一個(不設定就默認),stm32要設置兩個:搶占優先級和子優先級。RPi.GPIO主頁文檔中沒有說明這一點,我想通過一段代碼測試一下。

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup([35,37], GPIO.IN, GPIO.PUD_UP)

def my_callback_one(channel):
    print('--my_callback_one start--')
    for i in range(0, 100000):
        pass
    print('--my_callback_one end--')
def my_callback_two(channel):
    print('--my_callback_two start--')
    for i in range(0, 100000):
        pass
    print('--my_callback_two end--')
GPIO.add_event_detect(35, GPIO.FALLING, my_callback_one, bouncetime=200)
GPIO.add_event_detect(37, GPIO.FALLING, my_callback_two, bouncetime=200)

while True:
    time.sleep(1)
GPIO.cleanup()

我先是把35和37引腳連在一起,同時給下降沿,發現它們雖然都被觸發了,但還是會先執行一個,執行完后再執行下一個,而不會出現嵌套現象。然后我再嘗試先給35引腳一個下降沿,當35引腳的中斷被觸發,開始執行回調函數時但還沒有退出回調的時候我馬上給37引腳一個下降沿,此時37引腳并沒有馬上被觸發去調用它的回調函數而是等35引腳的回調函數執行完才被觸發。把35引腳和37引腳順序調過來情況也一樣。按理說樹莓派用3的BCM2837處理器的GPIO口中斷應該有嵌套、優先級的,估計已經被RPi.GPIO默認設置好了。可能被測試的引腳剛好被RPi.GPIO設置成優先級一個高一個低,不能被搶占。

以上是“在樹莓派3B上如何使用RPi.GPIO”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉环县| 宣城市| 广饶县| 夏津县| 南安市| 沈阳市| 兴义市| 芦溪县| 麻阳| 连平县| 乌兰浩特市| 固镇县| 昌都县| 抚宁县| 安远县| 东安县| 洛川县| 亚东县| 西和县| 城市| 五常市| 沂水县| 方城县| 玉山县| 余干县| 北安市| 灵台县| 北京市| 三原县| 舞钢市| 广平县| 房山区| 平江县| 绩溪县| 剑河县| 仙游县| 游戏| 凤阳县| 贵定县| 沧州市| 上思县|