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]odczytujeintz zakresu 0-255 z bajtu pod adresemaddr;mem8[addr] = valuezapisuje dolne 8 bitów wartościvalue.addrmusi być wyrównany do 1 bajtu (dowolny adres).
- machine.mem16#
Indeksowalny 16-bitowy (półsłowo) akcesor pamięci.
mem16[addr]odczytujeintz zakresu 0-65535;mem16[addr] = valuezapisuje dolne 16 bitów.addrmusi być wyrównany do 2 bajtów.
- machine.mem32#
Indeksowalny 32-bitowy (słowo) akcesor pamięci.
mem32[addr]odczytujeintz zakresu 0-0xFFFFFFFF;mem32[addr] = valuezapisuje dolne 32 bity.addrmusi 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
byteszawierają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
pini zwraca jego czas trwania w mikrosekundach.pinmusi być skonfigurowany jako wejście cyfrowe.pulse_levelto polaryzacja impulsu, którego czas ma być mierzony:1dla impulsu wysokiego,0dla 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 poziompulse_level(początek impulsu). Następnie mierzy czas, przez który pin pozostaje na poziomiepulse_levelprzed powrotem (koniec impulsu). Zmierzony czas zwracany jest w mikrosekundach.timeout_usogranicza każdą fazę niezależnie (więc w najgorszym przypadku wywołanie trwa do2 * 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:
0dla 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.SOFT_RESET: int#
Reset spowodowany przez
soft_reset()(interpreter Pythona uruchomił się ponownie bez sprzętowego resetu). Porty STM32 i mimxrt.
Klasy#
- klasa Pin – sterowanie pinami I/O
- klasa Signal – sterowanie i odczyt zewnętrznych urządzeń I/O
- klasa LED – przenośne sterowanie wbudowaną diodą LED
- klasa ADC – konwersja analogowo-cyfrowa
- klasa PWM – modulacja szerokości impulsu
- klasa UART – magistrala szeregowej komunikacji dwukierunkowej
- klasa SPI – protokół magistrali Serial Peripheral Interface (strona kontrolera)
- klasa SoftSPI – magistrala SPI emulowana programowo
- klasa I2C – dwuprzewodowy protokół szeregowy
- klasa SoftI2C – programowo emulowana magistrala I2C
- klasa I2CTarget – urządzenie docelowe I2C
- klasa I2S – protokół magistrali Inter-IC Sound
- klasa CAN – protokół Controller Area Network
- klasa RTC – zegar czasu rzeczywistego
- klasa Timer – wirtualny licznik czasu okresowy / jednorazowy
- klasa WDT – watchdog timer
- klasa SDCard – sterownik karty SD / MMC
- class Counter – licznik impulsów
- class Encoder – dekoder kwadraturowy