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#