machine — a hardverhez kapcsolódó függvények

A machine modul egy adott lap hardveréhez kapcsolódó specifikus függvényeket tartalmaz. A modul legtöbb függvénye lehetővé teszi a rendszer hardveres egységeihez (mint a CPU, időzítők, buszok stb.) való közvetlen és korlátlan hozzáférést és azok vezérlését.

Memóriahozzáférés

A modul három indexelhető objektumot tesz elérhetővé a nyers memóriahozzáféréshez. Mindegyik egy bájtcím szerint indexelt ritka tömbként viselkedik: a value = memN[addr] olvas, a memN[addr] = value ír. A cím mindig bájtcím, függetlenül a hozzáférés szélességétől.

machine.mem8

Indexelhető 8 bites memória-hozzáférő. A mem8[addr] egy 0-255 tartományba eső int-et olvas be az addr címen lévő bájtból; a mem8[addr] = value a value alsó 8 bitjét írja ki. Az addr-nak 1 bájtra kell igazodnia (bármely cím).

machine.mem16

Indexelhető 16 bites (félszó) memória-hozzáférő. A mem16[addr] egy 0-65535 tartományba eső int-et olvas be; a mem16[addr] = value az alsó 16 bitet írja ki. Az addr-nak 2 bájtra kell igazodnia.

machine.mem32

Indexelhető 32 bites (szó) memória-hozzáférő. A mem32[addr] egy 0-0xFFFFFFFF tartományba eső int-et olvas be; a mem32[addr] = value az alsó 32 bitet írja ki. Az addr-nak 4 bájtra kell igazodnia.

Példa használat (a regiszterek egy STM32H7 mikrovezérlőre specifikusak – az OpenMV Cam H7 / H7 Plus / Pure Thermal kameráknál a P0 fejlécláb a PB15-höz van bekötve):

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

Egyéb függvények

machine.unique_id() bytes

Visszaad egy bytes objektumot, amely ennek a lapnak az egyedi azonosítóját tartalmazza. Az érték az MCU hardveréből kerül kiolvasásra (jellemzően a gyárilag beprogramozott eszköz-sorozatszám), így az újraindítások során állandó, és lapról lapra eltér.

A hossz az MCU családtól függ – 12 bájt STM32-n, 8 bájt a mimxrt és alif portokon. Ha az alkalmazásodnak rögzített hosszúságú azonosítóra van szüksége, szeleteld vagy hash-eld a visszaadott értéket.

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

Megméri egyetlen impulzus szélességét a pin-en, és visszaadja annak időtartamát mikroszekundumban.

A pin-t digitális bemenetként kell konfigurálni.

A pulse_level a mérendő impulzus polaritása: 1 magas impulzushoz, 0 alacsony impulzushoz.

A függvény két fázisban működik. Először, ha a láb még nincs pulse_level-en, megvárja, amíg a láb átvált pulse_level-re (az impulzus kezdete). Ezután megméri, mennyi ideig marad a láb pulse_level-en, mielőtt visszavált (az impulzus vége). A mért időt mikroszekundumban adja vissza.

A timeout_us minden fázist függetlenül korlátoz (így egy legrosszabb esetbeli hívás akár 2 * timeout_us ideig is tarthat). Időtúllépéskor a függvény negatív értéket ad vissza, amely azonosítja, melyik fázis lépett túl az időn:

  • -2 – időtúllépés a felfutó él várásakor (a láb soha nem érte el a pulse_level-t).

  • -1 – időtúllépés a lefutó él várásakor (az impulzus hosszabb volt, mint a timeout_us).

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

Átviszi a data-t a megadott pin bit-banging módszerével. Az encoding argumentum megadja, hogyan vannak a bitek kódolva, a timing pedig egy kódolás-specifikus időzítési specifikáció.

A támogatott kódolások:

  • 0 a „magas alacsony” impulzus-időtartam modulációhoz. Ez a 0 és 1 biteket időzített impulzusokként továbbítja, a legjelentősebb bittel kezdve. A timing-nak egy négyelemű, nanoszekundumokból álló tuple-nek kell lennie a (high_time_0, low_time_0, high_time_1, low_time_1) formátumban. Például a (400, 850, 800, 450) a WS2812 RGB LED-ek időzítési specifikációja 800kHz-en.

Az időzítés pontossága hardverfüggő; a gyorsabb MCU-k szorosabb impulzusokat állítanak elő (jellemzően tíz nanoszekundumos nagyságrendben).

Megjegyzés

A WS2812 / NeoPixel szalagok vezérléséhez lásd a neopixel modult a magasabb szintű API-ért.

Konstansok

Az alábbi konstansokat a reset_cause() adja vissza, és azonosítják, miért állt vissza utoljára az MCU. Elérhető az STM32 és mimxrt portokon; az alif port (OpenMV Cam AE3) jelenleg nem tesz elérhetővé visszaállítási-ok konstansokat, és a reset_cause() mindig 0-t ad vissza.

machine.PWRON_RESET: int

A chipre kapcsolt tápfeszültség által okozott visszaállítás. STM32 és mimxrt portok.

machine.WDT_RESET: int

A watchdog időzítő lejárta által okozott visszaállítás. STM32 és mimxrt portok.

machine.SOFT_RESET: int

A soft_reset() által okozott visszaállítás (a Python értelmező hardveres visszaállítás nélkül indult újra). STM32 és mimxrt portok.

machine.HARD_RESET: int

Az NRST láb aktiválása (külső visszaállító gomb) által okozott visszaállítás. Csak STM32 portok.

machine.DEEPSLEEP_RESET: int

A mélyalvásból való ébredés által okozott visszaállítás. Csak STM32 portok.

Osztályok