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#