machine — funzioni relative all’hardware

Il modulo machine contiene funzioni specifiche relative all’hardware di una particolare scheda. La maggior parte delle funzioni in questo modulo consente di ottenere accesso e controllo diretti e senza restrizioni dei blocchi hardware di un sistema (come CPU, timer, bus, ecc.).

Accesso alla memoria

Il modulo espone tre oggetti indicizzabili usati per l’accesso grezzo alla memoria. Ciascuno si comporta come un array sparso indicizzato per indirizzo di byte: value = memN[addr] legge, memN[addr] = value scrive. L’indirizzo è sempre un indirizzo di byte, indipendentemente dalla larghezza dell’accesso.

machine.mem8

Accessore di memoria indicizzabile a 8 bit. mem8[addr] legge un int nell’intervallo 0-255 dal byte all’indirizzo addr; mem8[addr] = value scrive gli 8 bit bassi di value. addr deve essere allineato a 1 byte (qualsiasi indirizzo).

machine.mem16

Accessore di memoria indicizzabile a 16 bit (halfword). mem16[addr] legge un int nell’intervallo 0-65535; mem16[addr] = value scrive i 16 bit bassi. addr deve essere allineato a 2 byte.

machine.mem32

Accessore di memoria indicizzabile a 32 bit (word). mem32[addr] legge un int nell’intervallo 0-0xFFFFFFFF; mem32[addr] = value scrive i 32 bit bassi. addr deve essere allineato a 4 byte.

Esempio di utilizzo (i registri sono specifici di un microcontrollore STM32H7 – sulla OpenMV Cam H7 / H7 Plus / Pure Thermal il pin dell’header P0 è collegato a 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

Funzioni varie

machine.unique_id() bytes

Restituisce un oggetto bytes contenente un identificatore univoco per questa scheda. Il valore viene letto dall’hardware dell’MCU (tipicamente il numero di serie del dispositivo programmato in fabbrica), quindi è stabile tra i riavvii e differisce da una scheda all’altra.

La lunghezza dipende dalla famiglia dell’MCU – 12 byte su STM32, 8 byte sulle porte mimxrt e alif. Se la tua applicazione necessita di un ID a lunghezza fissa, esegui lo slice o l’hash del valore restituito.

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

Misura la larghezza di un singolo impulso su pin e restituisce la sua durata in microsecondi.

pin deve essere configurato come input digitale.

pulse_level è la polarità dell’impulso da misurare: 1 per un impulso alto, 0 per un impulso basso.

La funzione lavora in due fasi. Prima, se il pin non è già a pulse_level, attende che il pin transiti a pulse_level (l’inizio dell’impulso). Poi misura il tempo in cui il pin rimane a pulse_level prima di tornare indietro (la fine dell’impulso). Il tempo misurato viene restituito in microsecondi.

timeout_us limita ciascuna fase in modo indipendente (quindi una chiamata nel caso peggiore dura fino a 2 * timeout_us). In caso di timeout la funzione restituisce un valore negativo che identifica quale fase è andata in timeout:

  • -2 – timeout in attesa del fronte di salita (il pin non ha mai raggiunto pulse_level).

  • -1 – timeout in attesa del fronte di discesa (l’impulso è stato più lungo di timeout_us).

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

Trasmette data tramite bit-banging sul pin specificato. L’argomento encoding specifica come vengono codificati i bit, e timing è una specifica di temporizzazione dipendente dalla codifica.

Le codifiche supportate sono:

  • 0 per la modulazione della durata dell’impulso «high low». Questo trasmetterà i bit 0 e 1 come impulsi temporizzati, partendo dal bit più significativo. Il timing deve essere una quadrupla di nanosecondi nel formato (high_time_0, low_time_0, high_time_1, low_time_1). Ad esempio, (400, 850, 800, 450) è la specifica di temporizzazione per i LED RGB WS2812 a 800kHz.

L’accuratezza della temporizzazione dipende dall’hardware; gli MCU più veloci producono impulsi più precisi (tipicamente decine di nanosecondi).

Nota

Per il controllo delle strisce WS2812 / NeoPixel, vedere il modulo neopixel per un’API di livello superiore.

Costanti

Le costanti seguenti vengono restituite da reset_cause() e identificano il motivo per cui l’MCU si è resettato l’ultima volta. Disponibili sulle porte STM32 e mimxrt; la porta alif (OpenMV Cam AE3) attualmente non espone le costanti di causa del reset e il suo reset_cause() restituisce sempre 0.

machine.PWRON_RESET: int

Reset causato dall’applicazione dell’alimentazione al chip. Porte STM32 e mimxrt.

machine.WDT_RESET: int

Reset causato dalla scadenza del watchdog timer. Porte STM32 e mimxrt.

machine.SOFT_RESET: int

Reset causato da soft_reset() (l’interprete Python è stato riavviato senza un reset hardware). Porte STM32 e mimxrt.

machine.HARD_RESET: int

Reset causato dall’asserzione del pin NRST (pulsante di reset esterno). Solo porte STM32.

machine.DEEPSLEEP_RESET: int

Reset causato dal risveglio dal deep-sleep. Solo porte STM32.

Classi