machine — funkce související s hardwarem

Modul machine obsahuje specifické funkce související s hardwarem na konkrétní desce. Většina funkcí v tomto modulu umožňuje dosáhnout přímého a neomezeného přístupu k hardwarovým blokům systému (jako CPU, časovače, sběrnice atd.) a jejich řízení.

Přístup k paměti

Modul zpřístupňuje tři indexovatelné objekty používané pro přímý přístup k paměti. Každý se chová jako řídké pole indexované adresou bajtu: value = memN[addr] čte, memN[addr] = value zapisuje. Adresa je vždy adresa bajtu, bez ohledu na šířku přístupu.

machine.mem8

Indexovatelný 8bitový přístup k paměti. mem8[addr] čte int v rozsahu 0-255 z bajtu na adrese addr; mem8[addr] = value zapíše dolních 8 bitů hodnoty value. addr musí být zarovnán na 1 bajt (libovolná adresa).

machine.mem16

Indexovatelný 16bitový přístup k paměti (poloslovo). mem16[addr] čte int v rozsahu 0-65535; mem16[addr] = value zapíše dolních 16 bitů. addr musí být zarovnán na 2 bajty.

machine.mem32

Indexovatelný 32bitový přístup k paměti (slovo). mem32[addr] čte int v rozsahu 0-0xFFFFFFFF; mem32[addr] = value zapíše dolních 32 bitů. addr musí být zarovnán na 4 bajty.

Příklad použití (registry jsou specifické pro mikrokontrolér STM32H7 – na OpenMV Cam H7 / H7 Plus / Pure Thermal je header pin P0 propojen s 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

Různé funkce

machine.unique_id() bytes

Vrací objekt bytes obsahující jedinečný identifikátor této desky. Hodnota je načtena z hardwaru MCU (typicky tovární sériové číslo zařízení), takže je stabilní napříč restarty a liší se deska od desky.

Délka závisí na rodině MCU – 12 bajtů na STM32, 8 bajtů na mimxrt a alif portech. Pokud vaše aplikace potřebuje ID pevné délky, vrácenou hodnotu nařežte nebo zahashujte.

machine.time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1000000, /) int

Změří šířku jediného pulzu na pin a vrátí jeho trvání v mikrosekundách.

pin musí být nakonfigurován jako digitální vstup.

pulse_level je polarita pulzu, jehož trvání se má změřit: 1 pro vysoký pulz, 0 pro nízký pulz.

Funkce pracuje ve dvou fázích. Nejprve, pokud pin ještě není na úrovni pulse_level, čeká na přechod pinu na pulse_level (začátek pulzu). Poté měří dobu, po kterou pin zůstává na úrovni pulse_level, než se přepne zpět (konec pulzu). Naměřený čas je vrácen v mikrosekundách.

timeout_us ohraničuje každou fázi nezávisle (takže volání v nejhorším případě trvá až 2 * timeout_us). Při vypršení časového limitu funkce vrátí zápornou hodnotu identifikující, která fáze vypršela:

  • -2 – vypršel časový limit při čekání na náběžnou hranu (pin nikdy nedosáhl úrovně pulse_level).

  • -1 – vypršel časový limit při čekání na sestupnou hranu (pulz byl delší než timeout_us).

machine.bitstream(pin: Pin, encoding: int, timing: tuple, data: bytes, /) None

Vysílá data bit-bangingem na zadaném pinu pin. Argument encoding určuje, jak jsou bity kódovány, a timing je časová specifikace závislá na kódování.

Podporovaná kódování jsou:

  • 0 pro pulzně šířkovou modulaci typu „high low“. Tato vysílá bity 0 a 1 jako časované pulzy, počínaje nejvýznamnějším bitem. timing musí být čtyřprvkový tuple nanosekund ve formátu (high_time_0, low_time_0, high_time_1, low_time_1). Například (400, 850, 800, 450) je časová specifikace pro WS2812 RGB LED na 800 kHz.

Přesnost časování závisí na hardwaru; rychlejší MCU produkují přesnější pulzy (typicky desítky nanosekund).

Poznámka

Pro řízení WS2812 / NeoPixel pásků viz modul neopixel s vyšší úrovní API.

Konstanty

Níže uvedené konstanty vrací reset_cause() a identifikují, proč se MCU naposledy resetovalo. Dostupné na STM32 a mimxrt portech; alif port (OpenMV Cam AE3) v současnosti nezpřístupňuje konstanty příčiny resetu a jeho reset_cause() vždy vrací 0.

machine.PWRON_RESET: int

Reset způsobený přivedením napájení na čip. STM32 a mimxrt porty.

machine.WDT_RESET: int

Reset způsobený vypršením watchdog časovače. STM32 a mimxrt porty.

machine.SOFT_RESET: int

Reset způsobený soft_reset() (Python interpret se restartoval bez hardwarového resetu). STM32 a mimxrt porty.

machine.HARD_RESET: int

Reset způsobený aktivací pinu NRST (externí tlačítko resetu). Pouze STM32 porty.

machine.DEEPSLEEP_RESET: int

Reset způsobený probuzením z deep-sleep. Pouze STM32 porty.

Třídy