PYB操作-點燈開箱、GPIO操作

學習內容

pyb的一些簡單操作。熟悉micropython在pyb上面的應用

開發環境

putty、PYB nano

MocroPython的啓動模式

在啓動後,MicroPython會先運行 boot.py 文件,加載用戶驅動,然後在運行main.py,執行用戶程序。可以將用戶程序放在main.py中,也可以在main.py中再加載其它的文件。

常見故障

在使用過程中,我們需要注意下面問題,避免造成文件系統破壞、數據丟失。
取下數據線前,需要先U盤那樣安全刪除硬件,彈出PYBFLASH磁盤,否則可能會造成文件系統破壞,特別在修改了文件或複製新文件到PYBFLASH磁盤後。
不要輕易按復位鍵,這樣會造成當前的USB通訊中斷。一般的問題,可以通過按下Ctrl-D軟復位接近。

出廠模式

使用時間長了,因爲各種原因可能會出現故障,造成無法正常啓動,不能進入REPL,文件系統破壞等現象,這時就需要通過出廠模式進行恢復。

進入出廠模式的方法是:
按下復位鍵(RESET)的同時,按住用戶按鍵SW。
然後保持用戶按鍵不放,釋放復位鍵。
這時LED將循環顯示:綠-》黃-》綠+黃-》滅
等黃綠燈同時亮時,鬆開用戶鍵,這時黃綠燈會同時快速閃4次
然後紅燈亮起(這時紅綠黃三個燈同時亮)
紅燈滅,開始進行恢復到出廠狀態
所有燈都滅,恢復出廠設置完成。
恢復出廠設置後,PYBFLASH中的內容會丟失,變爲默認文件。

升級固件

MicroPython的更新速度很快,每次更新都會帶來一些新的功能,修正錯誤。所以掌握 MicroPython 的固件升級方法是有必要的。

PYB Nano支持下面幾種升級方法:
通過DFU模式升級 通過SWD方式升級
使用DFU模式,需要安裝ST的DfuSe_demo軟件(Windows)或者dfu-util(Linux)。使用SWD需要將開發板的SWD接口(PA13/PA14)連接到編程器,通過編程軟件下載。

REPL 的用法

通常調試程序時,都是在 MicroPython 的 REPL (read–eval–print loop,循環交互解釋器)環境下運行。在REPL下可以直接輸入命令,有內置的解釋器執行。如果命令輸入正常,就會顯示運行結果,否則會給出錯誤提示。

MicroPython支持幾個常用的快捷鍵,如果你熟悉串口終端,會發現它們的習慣是一樣的。

  • Ctrl-C,停止正在的程序或終止當前的命令行

  • Ctrl-D,軟復位(soft reset)

  • Ctrl-B,顯示系統提示

  • Ctrl-E,進入粘貼模式。可以按下Ctrl-C退出粘貼模式,Ctrl-D完成粘貼

  • Tab,鍵盤上的Tab鍵,可以補全命令
    除了Ctrl-C,其它快捷鍵需要在空命令行下(沒有輸入任何字符)才能生效。此外,還可以使用上下左右光標鍵

  • 上下鍵,調出以前輸入的命令。MicroPython可以保存最後輸入的6條命令

  • 左右鍵,在當前命令行中移動,編輯命令

配置終端

MicroPython和PC的標準連接是通過USB接口,使用虛擬磁盤和虛擬串口(VCP)方式。其中虛擬串口(在pyboard和STM32上可以同時使用USB虛擬串口和物理串口兩種方式)是調試中最常用的方式,無須頻繁複制文件避免造成Flash的損耗。在MicroPython上我們使用串口終端軟件和MicroPython的REPL進行交互,發送命令。通過串口終端軟件,我們可以方便地在 REPL 中輸入代碼,運行和調試程序,打印結果。開發MicroPython程序時,掌握終
端軟件的使用是非常有必要的,注意不要使用Windows下的串口調試助手、串口精靈這樣的軟件,因爲它們只適合一般的串口調試,發送數據,但是不方便輸入命令,不支持粘貼功能,不能和REPL進行交互操作。
這裏我用的是putty
配置過程接很簡單,首先打開設備管理器:

這裏可以看到對應PYB板子的串口,我們只需要在PUTTY打開這個串口終端即可。
這裏我的串口是COM20 波特率是115200,記得選擇serial。當然爲了方便大家可以把這個COM存起來。
在這裏插入圖片描述
大功告成!現在只需要打開對應的端口即可使用,效果如圖:
在這裏插入圖片描述
當然我們也可以在我的電腦板子上的文件:
在這裏插入圖片描述
下面就簡單操作下板載的函數熟悉下操作吧~

PYB庫函數操作

1.點燈工程師~(點亮,關閉,翻轉,閃爍)

首先要說明的是可以在終端進行代碼操作,也可以將代碼輸入main.py中,在終端中輸入的將不會保存,而在main.py中輸入後,保存後按下Ctrl+D後,實現軟件復位。將會看到編寫的代碼實現的操作。

import pyb
# 點亮操作
pyb.LED(1).on() #點亮 LED1
pyb.LED(2).on() #點亮 LED2
pyb.LED(3).on() #點亮 LED3
pyb.LED(4).on() #點亮 LED4

# 關閉操作
pyb.LED(1).off() #關閉 LED1
pyb.LED(2).off() #關閉 LED2

# 翻轉操作
pyb.LED(1).toggle() #翻轉 LED1

#閃爍操作
while True:
	pyb.LED(1).toggle() #翻轉 LED1
	pyb.delay(200) #延時200ms

除了打開、關閉、翻轉功能外,部分 LED 還可以控制亮度。在PYB上,LED3和LED4支持亮度調整功能,如可以這樣控制LED3的亮度:

import pyb
pyb.LED(3).intensity(10)

亮度的範圍爲0~255,0最暗(關閉),255最亮。對於那些不支持亮度功能的LED,在設置亮度時,0是關,大於0就是開。
LED.intensity([value])
讀取或者設置LED亮度。亮度的範圍是0(熄滅)到255(最亮)。
注意:只有LED(3)和LED(4)支持亮度調節功能,它們使用定時器的PWM方式來控制LED的亮度。LED(3)使用定時器2,LED(4)使用定時器3(如果改變了定時器2/3的參數,亮度調整功能會受到影響)。只有在使用了LED.intensity()功能,並且參數在1~
254之間時定時器纔會自動配置爲PWM模式。

1.1跑馬燈

import pyb
leds =[pyb.LED(i) for i in range(1,5)] #定義led
n=0
while True:
	n = (n+1)%4
	leds[n].on()
	pyb.delay(200)
	leds[n].off()

1.2.往返式跑馬燈

import pyb
n=1
dn=1
while True:
	pyb.LED(n).toggle()
	pyb.delay(200)
	pyb.LED(n).toggle()
	n=n+dn
	if (n>3)or(n<2):
		dn=-dn;#改變方向

2.按鍵的操作

2.1 讀取按鍵鍵值

import pyb
sw = pyb.Switch() #定義按鍵對象
print(sw()) #讀取按鍵狀態

如果按下了按鍵,就返回True,否則返回False。我們還可以定義一個按鍵的回調函數(類似C語言裏的中斷函數),當按下按鍵時將自動執行這個回調函數。下面定義的回調函數中,每當按下一次按鍵,就將翻轉一次LED1。

2.2 讀取按鍵鍵值

import pyb
sw = pyb.Switch() #定義按鍵對象
print(sw()) #讀取按鍵狀態
while True:
	sw.callback(lambda:pyb.LED(1).toggle())

自己定義函數進行類似外部中斷操作:

# main.py -- put your code here!
import pyb
sw = pyb.Switch() #定義按鍵對象
print(sw()) #讀取按鍵狀態
def f():
	pyb.LED(1).toggle()
while True:
	sw.callback(f)

3.GPIO的使用

首先我們需要導入pyb中的Pin模塊,然後就可以定義一個Pin對象,及其使用的引腳和功能。這個和PYNQ操作類似:

3.1 配置gpio

from pyb import Pin
pin_demo =  Pin(Pin.cpu.A0) # 定義GPIO
pin_demo.init(Pin.OUT) # 配置gpio爲輸出

3.2 配置gpio功能

我們知道一個標準的GPIO可以設置爲輸入或者輸出,在MicroPython中,可以用init()函數去設置Pin的功能,除了通用輸出外,還可以設置推輓方式輸出和開漏輸出:

pin_demo.init(Pin.OUT) # 配置gpio爲通用輸出
pin_demo.init(Pin.OUT_PP) # 配置gpio爲推輓輸出
pin_demo.init(Pin.OUT_OD) # 配置gpio爲開漏輸出
pin_demo.init(Pin.IN) # 配置gpio爲輸入

對於輸入,還可以設置內部的上拉下拉電阻狀態,比如設置上拉電阻的方法是:

pin_demo.init(Pin.IN,pull=PULL_UP) # 配置gpio爲輸入

需要下拉電阻時設置pull參數爲:pull=PULL_DOWN,而不需要上拉下拉電阻時就設置pull=PULL_NONE。

3.3 配置GPIO的輸出

我們可以使用下面方法控制:

pin_demo.high()  #high
pin_demo(1)

pin_demo.low()  #low
pin_demo(0)

也可以使用value()函數設置輸出電平:

pin_demo.value(1)
pin_demo.value(0)

3.4 配置GPIO的輸入

對於GPIO的輸入,可以直接讀取:

pin_demo()

或者使用不帶參數的value()函數:

pin_demo.value()

init(mode,pull=Pin.PULL_NONE,af=-1)

初始化GPIO。
mode:
◆ Pin.IN-輸入
◆ Pin.OUT_PP-推輓輸出(push-pull)
◆ Pin.OUT_OD-開漏輸出(open-drain)
◆ Pin.AF_PP-第二功能,推輓模式
◆ Pin.AF_OD-第二功能,開漏模式
◆ Pin.ANALOG-模擬功能
pull
◆ Pin.PULL_NONE-無上拉下拉
◆ Pin.PULL_UP-上拉
◆ Pin.PULL_DOWN-下拉
af,當mode是Pin.AF_PP或Pin.AF_OD時,可以選擇第二功能索引或名稱
● af_list()
返回GPIO的第二功能列表

Pin.af_list(pyb.Pin.board.X1)
[Pin.AF1_TIM2, Pin.AF2_TIM5, Pin.AF7_USART2]

af()
返回GPIO第二功能索引值,如果沒有使用第二功能將返回0,否則返回實際的索引值。
注意這個索引值並不是對應af_list()函數返回的列表,而是控制器手冊中的第二功能映射表。PYB V10使用的控制器是STM32F405RG,可以參考它的數據手冊第61頁的“Table 9.Alternatefunction mapping”。如,PA11是AF10_USB_DM功能:

 Pin.af(pyb.Pin("A11"))
10

3.5 name

name() 返回GPIO的名稱,如:

Pin.name(Pin("X15"))
'A8'

ain = Pin(Pin.cpu.A0)
ain.name()
'A0'

names()
返回GPIO和別名,如:

ain = Pin(Pin.cpu.A0)
ain.names()
['A0', 'X0', 'PA0']

pin() 返回引腳在端口中的序號
port() 返回端口序號。端口A的序號是0,端口B的序號是1,端口C的序號是2,以此類推。按鍵sw對應的引腳是B3,因此返回值是1。
● pull() 引腳的上拉狀態。具體參數含義參考init()函數中pull參數。

在定義 GPIO 時我們使用了兩種不同方式的名稱。
第一種方式使用MCU的引腳名稱,比較直觀,但是比較長。
第二種方式是爲GPIO起一個別名(小名),通過這個別名去使用GPIO,比較簡潔。GPIO的別名並不是GPIO的定義,它只是爲了方便區分不同的GPIO,從而方便後面編程使用。
在PYB V10上有兩排排針,從板子中心分爲兩個部分。上邊的以字母″Y″加數字命名,下邊的以字母″X″加數字命名。注意″X″、″Y″這種方式只是MicroPython團隊給出的一種命名方式,並不是一種標準。GPIO的別名不同於GPIO的變量名,它是可以任意起的,它是在編譯固件時就設定好,一個GPIO可以有多個別名。如,對於用戶按鍵,就有″X17″、″SW″等別名,我們可以用下面幾種方式定義,效果是完全一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章