machine — funkcje związane ze sprzętem

Moduł machine zawiera specyficzne funkcje związane ze sprzętem konkretnej płytki. Większość funkcji w tym module pozwala uzyskać bezpośredni i nieograniczony dostęp do bloków sprzętowych systemu (takich jak CPU, liczniki czasu, magistrale itp.) oraz kontrolę nad nimi.

Dostęp do pamięci

Moduł udostępnia trzy indeksowalne obiekty służące do bezpośredniego dostępu do pamięci. Każdy z nich zachowuje się jak rzadka tablica indeksowana adresem bajtu: value = memN[addr] odczytuje, a memN[addr] = value zapisuje. Adres jest zawsze adresem bajtu, niezależnie od szerokości dostępu.

machine.mem8

Indeksowalny 8-bitowy akcesor pamięci. mem8[addr] odczytuje int z zakresu 0-255 z bajtu pod adresem addr; mem8[addr] = value zapisuje dolne 8 bitów wartości value. addr musi być wyrównany do 1 bajtu (dowolny adres).

machine.mem16

Indeksowalny 16-bitowy (półsłowo) akcesor pamięci. mem16[addr] odczytuje int z zakresu 0-65535; mem16[addr] = value zapisuje dolne 16 bitów. addr musi być wyrównany do 2 bajtów.

machine.mem32

Indeksowalny 32-bitowy (słowo) akcesor pamięci. mem32[addr] odczytuje int z zakresu 0-0xFFFFFFFF; mem32[addr] = value zapisuje dolne 32 bity. addr musi być wyrównany do 4 bajtów.

Przykład użycia (rejestry są specyficzne dla mikrokontrolera STM32H7 – na OpenMV Cam H7 / H7 Plus / Pure Thermal pin P0 na złączu jest połączony z 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

Funkcje różne

machine.unique_id() bytes

Zwraca obiekt bytes zawierający unikalny identyfikator tej płytki. Wartość jest odczytywana ze sprzętu MCU (zazwyczaj jest to zaprogramowany fabrycznie numer seryjny urządzenia), więc jest stabilna pomiędzy restartami i różni się dla każdej płytki.

Długość zależy od rodziny MCU – 12 bajtów na STM32, 8 bajtów na portach mimxrt i alif. Jeśli aplikacja potrzebuje ID o stałej długości, wytnij fragment lub zahaszuj zwróconą wartość.

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

Mierzy szerokość pojedynczego impulsu na pin i zwraca jego czas trwania w mikrosekundach.

pin musi być skonfigurowany jako wejście cyfrowe.

pulse_level to polaryzacja impulsu, którego czas ma być mierzony: 1 dla impulsu wysokiego, 0 dla impulsu niskiego.

Funkcja działa w dwóch fazach. Najpierw, jeśli pin nie jest jeszcze na poziomie pulse_level, czeka, aż pin przejdzie na poziom pulse_level (początek impulsu). Następnie mierzy czas, przez który pin pozostaje na poziomie pulse_level przed powrotem (koniec impulsu). Zmierzony czas zwracany jest w mikrosekundach.

timeout_us ogranicza każdą fazę niezależnie (więc w najgorszym przypadku wywołanie trwa do 2 * timeout_us). W przypadku przekroczenia limitu czasu funkcja zwraca wartość ujemną wskazującą, której fazy dotyczył limit:

  • -2 – przekroczono limit czasu podczas oczekiwania na zbocze narastające (pin nigdy nie osiągnął pulse_level).

  • -1 – przekroczono limit czasu podczas oczekiwania na zbocze opadające (impuls był dłuższy niż timeout_us).

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

Transmituje data metodą bit-bangingu na określonym pin. Argument encoding określa sposób kodowania bitów, a timing to specyfikacja czasowa zależna od kodowania.

Obsługiwane kodowania to:

  • 0 dla modulacji czasu trwania impulsu typu „high low”. Spowoduje to transmisję bitów 0 i 1 jako impulsów o określonym czasie, zaczynając od najbardziej znaczącego bitu. timing musi być czteroelementową krotką nanosekund w formacie (high_time_0, low_time_0, high_time_1, low_time_1). Na przykład (400, 850, 800, 450) to specyfikacja czasowa dla diod RGB WS2812 przy 800 kHz.

Dokładność czasowa zależy od sprzętu; szybsze MCU produkują bardziej precyzyjne impulsy (zazwyczaj kilkadziesiąt nanosekund).

Informacja

Do sterowania paskami WS2812 / NeoPixel zobacz moduł neopixel, który oferuje API wyższego poziomu.

Stałe

Poniższe stałe są zwracane przez reset_cause() i identyfikują, dlaczego MCU ostatnio się zresetował. Dostępne na portach STM32 i mimxrt; port alif (OpenMV Cam AE3) nie udostępnia obecnie stałych przyczyny resetu, a jego reset_cause() zawsze zwraca 0.

machine.PWRON_RESET: int

Reset spowodowany doprowadzeniem zasilania do układu. Porty STM32 i mimxrt.

machine.WDT_RESET: int

Reset spowodowany wygaśnięciem watchdog timera. Porty STM32 i mimxrt.

machine.SOFT_RESET: int

Reset spowodowany przez soft_reset() (interpreter Pythona uruchomił się ponownie bez sprzętowego resetu). Porty STM32 i mimxrt.

machine.HARD_RESET: int

Reset spowodowany ustawieniem pinu NRST (zewnętrzny przycisk resetu). Tylko porty STM32.

machine.DEEPSLEEP_RESET: int

Reset spowodowany wybudzeniem z trybu deep-sleep. Tylko porty STM32.

Klasy