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