machine — funkcije povezane s hardverom

Modul machine sadrži posebne funkcije povezane s hardverom na određenoj ploči. Većina funkcija u ovom modulu omogućuje izravan i neograničen pristup te upravljanje hardverskim blokovima na sustavu (poput CPU-a, mjerača vremena, sabirnica itd.).

Pristup memoriji

Modul izlaže tri indeksirajuća objekta koji se koriste za izravan pristup memoriji. Svaki se ponaša poput rijetkog polja indeksiranog adresom bajta: value = memN[addr] čita, memN[addr] = value zapisuje. Adresa je uvijek adresa bajta, neovisno o širini pristupa.

machine.mem8

Indeksirajući 8-bitni pristupnik memoriji. mem8[addr] čita int u rasponu 0-255 iz bajta na addr; mem8[addr] = value zapisuje donjih 8 bitova vrijednosti value. addr mora biti poravnat na 1 bajt (bilo koja adresa).

machine.mem16

Indeksirajući 16-bitni (poluriječ) pristupnik memoriji. mem16[addr] čita int u rasponu 0-65535; mem16[addr] = value zapisuje donjih 16 bitova. addr mora biti poravnat na 2 bajta.

machine.mem32

Indeksirajući 32-bitni (riječ) pristupnik memoriji. mem32[addr] čita int u rasponu 0-0xFFFFFFFF; mem32[addr] = value zapisuje donjih 32 bita. addr mora biti poravnat na 4 bajta.

Primjer upotrebe (registri su specifični za STM32H7 mikrokontroler – na OpenMV Cam H7 / H7 Plus / Pure Thermal header pin P0 spojen je na 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

Razne funkcije

machine.unique_id() bytes

Vraća bytes objekt koji sadrži jedinstveni identifikator za ovu ploču. Vrijednost se očitava iz hardvera MCU-a (obično tvornički programirani serijski broj uređaja), pa je stabilna kroz ponovna pokretanja i razlikuje se od jedne ploče do druge.

Duljina ovisi o porodici MCU-a – 12 bajtova na STM32, 8 bajtova na mimxrt i alif portovima. Ako vaša aplikacija treba ID fiksne duljine, izrežite ili hashirajte vraćenu vrijednost.

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

Mjeri širinu jednog impulsa na pin i vraća njegovo trajanje u mikrosekundama.

pin mora biti konfiguriran kao digitalni ulaz.

pulse_level je polaritet impulsa koji se mjeri: 1 za visoki impuls, 0 za niski impuls.

Funkcija radi u dvije faze. Prvo, ako pin već nije na pulse_level, čeka da pin prijeđe na pulse_level (početak impulsa). Zatim mjeri vrijeme koliko pin ostaje na pulse_level prije nego što se vrati natrag (kraj impulsa). Izmjereno vrijeme vraća se u mikrosekundama.

timeout_us ograničava svaku fazu neovisno (pa poziv u najgorem slučaju traje do 2 * timeout_us). Pri isteku vremena funkcija vraća negativnu vrijednost koja identificira koja je faza istekla:

  • -2 – isteklo vrijeme čekanja na vodeći rub (pin nikada nije dosegao pulse_level).

  • -1 – isteklo vrijeme čekanja na prateći rub (impuls je bio dulji od timeout_us).

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

Šalje data bit-bangingom navedenog pin. Argument encoding određuje kako su bitovi kodirani, a timing je specifikacija vremenskog rasporeda ovisna o kodiranju.

Podržana kodiranja su:

  • 0 za modulaciju trajanja impulsa „visoko nisko”. Ovo će prenijeti bitove 0 i 1 kao vremenski određene impulse, počevši od najznačajnijeg bita. timing mora biti četvorka nanosekundi u formatu (high_time_0, low_time_0, high_time_1, low_time_1). Na primjer, (400, 850, 800, 450) je specifikacija vremenskog rasporeda za WS2812 RGB LED-ice na 800kHz.

Točnost vremenskog rasporeda ovisi o hardveru; brži MCU-ovi proizvode preciznije impulse (obično desetke nanosekundi).

Napomena

Za upravljanje WS2812 / NeoPixel trakama vidjeti modul neopixel za API više razine.

Konstante

Konstante u nastavku vraća reset_cause() i identificiraju zašto se MCU posljednji put resetirao. Dostupno na STM32 i mimxrt portovima; alif port (OpenMV Cam AE3) trenutno ne izlaže konstante uzroka resetiranja, a njegov reset_cause() uvijek vraća 0.

machine.PWRON_RESET: int

Resetiranje uzrokovano dovođenjem napajanja na čip. STM32 i mimxrt portovi.

machine.WDT_RESET: int

Resetiranje uzrokovano istekom watchdog mjerača vremena. STM32 i mimxrt portovi.

machine.SOFT_RESET: int

Resetiranje uzrokovano soft_reset() (Python interpreter ponovno pokrenut bez hardverskog resetiranja). STM32 i mimxrt portovi.

machine.HARD_RESET: int

Resetiranje uzrokovano aktiviranjem NRST pina (vanjski reset gumb). Samo STM32 portovi.

machine.DEEPSLEEP_RESET: int

Resetiranje uzrokovano buđenjem iz dubokog spavanja. Samo STM32 portovi.

Klase