machine --- 與硬體相關的函式¶
machine 模組包含與特定開發板硬體相關的特定函式。此模組中的大多數函式可讓你直接且不受限制地存取與控制系統上的硬體區塊(如 CPU、計時器、匯流排等)。
記憶體存取¶
此模組公開三個可下標(subscriptable)的物件,用於原始記憶體存取。每個物件的行為都類似以位元組位址索引的稀疏陣列:value = memN[addr] 進行讀取,memN[addr] = value 進行寫入。無論存取寬度為何,位址永遠是位元組位址。
- machine.mem8¶
可下標的 8 位元記憶體存取器。
mem8[addr]從addr處的位元組讀取範圍 0-255 的int;mem8[addr] = value寫入value的低 8 位元。addr必須對齊到 1 位元組(任何位址皆可)。
- machine.mem16¶
可下標的 16 位元(半字組)記憶體存取器。
mem16[addr]讀取範圍 0-65535 的int;mem16[addr] = value寫入低 16 位元。addr必須對齊到 2 位元組。
- machine.mem32¶
可下標的 32 位元(字組)記憶體存取器。
mem32[addr]讀取範圍 0-0xFFFFFFFF 的int;mem32[addr] = value寫入低 32 位元。addr必須對齊到 4 位元組。
使用範例(暫存器專屬於 STM32H7 微控制器——在 OpenMV Cam H7 / H7 Plus / Pure Thermal 上,排針接腳 P0 接到 PB15):
import machine
from micropython import const
GPIOB = const(0x58020400)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)
# set P0 (PB15) high via the GPIOB bit-set/reset register
machine.mem32[GPIOB + GPIO_BSRR] = 1 << 15
# read P0 (PB15) directly out of the GPIOB input-data register
value = (machine.mem32[GPIOB + GPIO_IDR] >> 15) & 1
其他函式¶
- machine.unique_id() bytes¶
傳回一個
bytes物件,內含此開發板的唯一識別碼。該值是從 MCU 的硬體讀取(通常是出廠時燒錄的裝置序號),因此跨重新開機保持穩定,且每塊開發板各不相同。長度取決於 MCU 系列——STM32 上為 12 位元組,mimxrt 與 alif 連接埠上為 8 位元組。如果你的應用程式需要固定長度的 ID,請對傳回值進行切片或雜湊。
- machine.time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1000000, /) int¶
測量
pin上單一脈衝的寬度,並以微秒傳回其持續時間。pin必須設定為數位輸入。pulse_level是要計時的脈衝極性:1表示高脈衝,0表示低脈衝。此函式分兩個階段運作。首先,如果接腳尚未處於
pulse_level,它會等待接腳轉變為pulse_level(脈衝的起點)。然後它測量接腳在轉變回去之前停留在pulse_level的時間(脈衝的終點)。測得的時間以微秒傳回。timeout_us會獨立限制每個階段(因此最壞情況下的呼叫最長持續2 * timeout_us)。逾時時,函式會傳回一個負值,用以識別哪個階段逾時:-2—— 等待前緣時逾時(接腳從未達到pulse_level)。-1—— 等待後緣時逾時(脈衝長度超過timeout_us)。
- machine.bitstream(pin: Pin, encoding: int, timing: tuple, data: bytes, /) None¶
透過對指定的 pin 進行位元觸發(bit-banging)來傳輸 data。encoding 引數指定位元如何編碼,而 timing 是特定編碼的時序規格。
支援的編碼有:
0表示「高低」脈衝持續時間調變。這會將 0 與 1 位元以定時脈衝傳輸,從最高有效位元開始。timing 必須是格式為(high_time_0, low_time_0, high_time_1, low_time_1)的奈秒四元組。例如,(400, 850, 800, 450)是 800kHz WS2812 RGB LED 的時序規格。
時序準確度取決於硬體;較快的 MCU 會產生更精確的脈衝(通常為數十奈秒)。
備註
若要控制 WS2812 / NeoPixel 燈條,請參閱
neopixel模組以取得更高階的 API。
常數¶
下列常數由 reset_cause() 傳回,用以識別 MCU 上次重設的原因。可在 STM32 與 mimxrt 連接埠上使用;alif 連接埠(OpenMV Cam AE3)目前未公開重設原因常數,且其 reset_cause() 永遠傳回 0。
- machine.SOFT_RESET: int¶
由於
soft_reset()而導致的重設(Python 直譯器在沒有硬體重設的情況下重新啟動)。STM32 與 mimxrt 連接埠。
類別¶
- class Pin -- 控制 I/O 接腳
- class Signal -- 控制與感測外部 I/O 裝置
- class LED —— 可攜式板載 LED 控制
- class ADC -- 類比數位轉換
- class PWM —— 脈衝寬度調變
- class UART -- 雙工序列通訊匯流排
- class SPI -- 序列周邊介面匯流排協定(控制器端)
- class SoftSPI -- 軟體模擬的 SPI 匯流排
- class I2C -- 雙線串列協定
- class SoftI2C -- 軟體模擬的 I2C 匯流排
- class I2CTarget -- 一個 I2C 目標裝置
- class I2S —— Inter-IC Sound 匯流排協定
- class CAN -- 控制器區域網路(Controller Area Network)通訊協定
- class RTC -- 即時時鐘
- class Timer -- 虛擬週期性 / 單次計時器
- class WDT -- 看門狗計時器
- class SDCard -- SD / MMC 卡驅動程式
- class Counter -- 脈衝計數器
- class Encoder -- 正交解碼器