rp2 --- RP2040 專屬功能¶
rp2 模組包含 RP2040 專屬的函式與類別,如 Raspberry Pi Pico 上所使用的那些。
詳情請參閱 RP2040 Python 資料手冊,範例程式碼請參閱 pico-micropython-examples。
PIO 組合語言指令¶
PIO 狀態機是以一種自訂的組合語言搭配九個核心 PIO 機器指令進行程式設計。在 MicroPython 中,PIO 組合語言常式以帶有 @rp2.asm_pio() 裝飾子的 Python 函式撰寫,並使用 Python 語法。這類常式支援標準的 Python 變數與算術運算,以及下列用於編碼 PIO 指令與指示組譯器的自訂函式。進一步細節請參閱 RP2040 資料手冊第 3.4 節。
- wrap_target()
指定程式環繞後執行繼續進行的位置。預設為 PIO 常式的起始處。
- wrap()
指定程式結束並環繞回去的位置。若未使用此指示,則會自動加在 PIO 常式的結尾處。環繞不消耗任何執行週期。
- label(label)
在目前位置定義一個名為 label 的標籤。label 可以是字串或整數。
- word(instr, label=None)
在組譯後的輸出中插入一個任意的 16 位元字組。
instr:16 位元的值
label:若有提供,則查找該標籤並將標籤的值與 instr 進行邏輯或(OR)運算
- jmp(...)
此指令有兩種形式:
- jmp(label)
label:無條件跳躍至的標籤
- jmp(cond, label)
cond:要檢查的條件,為下列之一:
not_x、not_y:若暫存器為零則為真x_dec、y_dec:若暫存器非零則為真,並執行後遞減x_not_y:若 X 不等於 Y 則為真pin:若輸入接腳被設定則為真not_osre:若 OSR 不為空(尚未達到其閾值)則為真
label:若條件為真則跳躍至的標籤
- wait(polarity, src, index)
封鎖,等待接腳或 IRQ 線上的高/低電位。
polarity:0 或 1,表示要等待低電位值還是高電位值
src:為下列之一:
gpio(絕對接腳)、pin(相對於 StateMachine 之in_base引數的接腳)、irqindex:0-31,src 的索引
- in_(src, bit_count)
將資料從 src 移入 ISR。
src:為下列之一:
pins、x、y、null、isr、osrbit_count:要移入的位元數(1-32)
- out(dest, bit_count)
將資料從 OSR 移出至 dest。
dest:為下列之一:
pins、x、y、pindirs、pc、isr、execbit_count:要移出的位元數(1-32)
- push(...)
將 ISR 推入 RX FIFO,然後將 ISR 清為零。此指令有下列形式:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
若使用
block,則 RX FIFO 已滿時指令會停滯。預設為封鎖。若使用iffull,則僅在輸入移位計數達到其閾值時才推入。- pull(...)
從 TX FIFO 拉取至 OSR。此指令有下列形式:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
若使用
block,則 TX FIFO 為空時指令會停滯。預設為封鎖。若使用ifempty,則僅在輸出移位計數達到其閾值時才拉取。- mov(dest, src)
將 src 的值移入 dest。
dest:為下列之一:
pins、x、y、exec、pc、isr、osrsrc:為下列之一:
pins、x、y、null、status、isr、osr;此引數可選擇性地以invert()或reverse()包裝進行修飾(但兩者不可同時使用)
- irq(...)
設定或清除一個 IRQ 旗標。此指令有兩種形式:
- irq(index)
index:0-7,或
rel(0)至rel(7)
- irq(mode, index)
mode:為下列之一:
block、clearindex:0-7,或
rel(0)至rel(7)
若使用
block,則指令會停滯直到旗標被其他實體清除為止。若使用clear,則旗標會被清除而非被設定。相對 IRQ 索引會將狀態機 ID 以模 4 加法加到 IRQ 索引上。IRQ 0-3 對處理器可見,4-7 為狀態機內部使用。- set(dest, data)
以值 data 設定 dest。
dest:
pins、x、y、pindirsdata:值(0-31)
- nop()
這是一個偽指令,會組譯為
mov(y, y)且無副作用。- .side(value)
這是一個可套用於任何指令的修飾子,用於控制 side-set 接腳值。
value:要在 side-set 接腳上輸出的值(位元)
- .delay(value)
這是一個可套用於任何指令的修飾子,用於指定指令執行後要延遲多少個週期。
value:要延遲的週期數,0-31(若使用 side-set 接腳,最大值會減少)
- [value]
這是一個修飾子,等同於
.delay(value)。