machine — funcții legate de hardware

Modulul machine conține funcții specifice legate de hardware-ul de pe o anumită placă. Majoritatea funcțiilor din acest modul permit obținerea accesului direct și nerestricționat la blocurile hardware ale unui sistem (cum ar fi CPU, temporizatoare, magistrale etc.), precum și controlul acestora.

Acces la memorie

Modulul expune trei obiecte indexabile folosite pentru accesul brut la memorie. Fiecare se comportă ca un tablou rar indexat după adresa de octet: value = memN[addr] citește, memN[addr] = value scrie. Adresa este întotdeauna o adresă de octet, indiferent de lățimea accesului.

machine.mem8

Accesor de memorie pe 8 biți, indexabil. mem8[addr] citește un int în intervalul 0-255 din octetul de la addr; mem8[addr] = value scrie cei mai puțin semnificativi 8 biți ai lui value. addr trebuie aliniat la 1 octet (orice adresă).

machine.mem16

Accesor de memorie pe 16 biți (semicuvânt), indexabil. mem16[addr] citește un int în intervalul 0-65535; mem16[addr] = value scrie cei mai puțin semnificativi 16 biți. addr trebuie aliniat la 2 octeți.

machine.mem32

Accesor de memorie pe 32 de biți (cuvânt), indexabil. mem32[addr] citește un int în intervalul 0-0xFFFFFFFF; mem32[addr] = value scrie cei mai puțin semnificativi 32 de biți. addr trebuie aliniat la 4 octeți.

Exemplu de utilizare (registrele sunt specifice unui microcontroler STM32H7 – pe OpenMV Cam H7 / H7 Plus / Pure Thermal pinul de pe header P0 este conectat la 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

Funcții diverse

machine.unique_id() bytes

Returnează un obiect bytes ce conține un identificator unic pentru această placă. Valoarea este citită din hardware-ul MCU-ului (de obicei numărul de serie al dispozitivului programat din fabrică), deci este stabilă între reporniri și diferă de la o placă la alta.

Lungimea depinde de familia MCU-ului – 12 octeți pe STM32, 8 octeți pe porturile mimxrt și alif. Dacă aplicația dvs. are nevoie de un ID de lungime fixă, secționați sau aplicați hash valorii returnate.

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

Măsoară lățimea unui singur impuls pe pin și returnează durata acestuia în microsecunde.

pin trebuie configurat ca intrare digitală.

pulse_level este polaritatea impulsului care urmează să fie cronometrat: 1 pentru un impuls la nivel ridicat, 0 pentru un impuls la nivel coborât.

Funcția lucrează în două faze. Mai întâi, dacă pinul nu se află deja la pulse_level, așteaptă ca pinul să treacă la pulse_level (începutul impulsului). Apoi măsoară timpul cât pinul rămâne la pulse_level înainte de a reveni (sfârșitul impulsului). Timpul măsurat este returnat în microsecunde.

timeout_us limitează fiecare fază independent (astfel încât un apel în cel mai rău caz durează până la 2 * timeout_us). La timeout, funcția returnează o valoare negativă care identifică ce fază a expirat:

  • -2 – a expirat în așteptarea muchiei ascendente (pinul nu a atins niciodată pulse_level).

  • -1 – a expirat în așteptarea muchiei descendente (impulsul a fost mai lung decât timeout_us).

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

Transmite data prin bit-banging pe pin-ul specificat. Argumentul encoding specifică modul în care sunt codificați biții, iar timing este o specificație de temporizare specifică codificării.

Codificările acceptate sunt:

  • 0 pentru modulația duratei impulsului „high low”. Aceasta va transmite biții 0 și 1 ca impulsuri cronometrate, începând cu cel mai semnificativ bit. timing trebuie să fie un tuplu cu patru elemente de nanosecunde în formatul (high_time_0, low_time_0, high_time_1, low_time_1). De exemplu, (400, 850, 800, 450) este specificația de temporizare pentru LED-urile RGB WS2812 la 800kHz.

Acuratețea temporizării depinde de hardware; MCU-urile mai rapide produc impulsuri mai precise (de obicei zeci de nanosecunde).

Notă

Pentru controlul benzilor WS2812 / NeoPixel, vezi modulul neopixel pentru un API de nivel superior.

Constante

Constantele de mai jos sunt returnate de reset_cause() și identifică motivul ultimei resetări a MCU-ului. Disponibile pe porturile STM32 și mimxrt; portul alif (OpenMV Cam AE3) nu expune în prezent constante pentru cauza resetării, iar reset_cause() al său returnează întotdeauna 0.

machine.PWRON_RESET: int

Resetare cauzată de aplicarea alimentării la cip. Porturile STM32 și mimxrt.

machine.WDT_RESET: int

Resetare cauzată de expirarea temporizatorului de supraveghere (watchdog). Porturile STM32 și mimxrt.

machine.SOFT_RESET: int

Resetare cauzată de soft_reset() (interpretorul Python a repornit fără o resetare hardware). Porturile STM32 și mimxrt.

machine.HARD_RESET: int

Resetare cauzată de asertarea pinului NRST (buton extern de resetare). Doar porturile STM32.

machine.DEEPSLEEP_RESET: int

Resetare cauzată de trezirea din deep-sleep. Doar porturile STM32.

Clase