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 unintnell’intervallo 0-255 dal byte all’indirizzoaddr;mem8[addr] = valuescrive gli 8 bit bassi divalue.addrdeve essere allineato a 1 byte (qualsiasi indirizzo).
- machine.mem16#
Accessore di memoria indicizzabile a 16 bit (halfword).
mem16[addr]legge unintnell’intervallo 0-65535;mem16[addr] = valuescrive i 16 bit bassi.addrdeve essere allineato a 2 byte.
- machine.mem32#
Accessore di memoria indicizzabile a 32 bit (word).
mem32[addr]legge unintnell’intervallo 0-0xFFFFFFFF;mem32[addr] = valuescrive i 32 bit bassi.addrdeve 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
bytescontenente 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
pine restituisce la sua durata in microsecondi.pindeve essere configurato come input digitale.pulse_levelè la polarità dell’impulso da misurare:1per un impulso alto,0per un impulso basso.La funzione lavora in due fasi. Prima, se il pin non è già a
pulse_level, attende che il pin transiti apulse_level(l’inizio dell’impulso). Poi misura il tempo in cui il pin rimane apulse_levelprima di tornare indietro (la fine dell’impulso). Il tempo misurato viene restituito in microsecondi.timeout_uslimita ciascuna fase in modo indipendente (quindi una chiamata nel caso peggiore dura fino a2 * 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 raggiuntopulse_level).-1– timeout in attesa del fronte di discesa (l’impulso è stato più lungo ditimeout_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:
0per 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
neopixelper 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.SOFT_RESET: int#
Reset causato da
soft_reset()(l’interprete Python è stato riavviato senza un reset hardware). Porte STM32 e mimxrt.
Classi#
- class Pin – controllo dei pin di I/O
- class Signal – controlla e rileva dispositivi di I/O esterni
- classe LED – controllo portabile dei LED on-board
- class ADC – conversione analogico-digitale
- classe PWM – modulazione di larghezza di impulso
- classe UART – bus di comunicazione seriale duplex
- class SPI – protocollo bus Serial Peripheral Interface (lato controller)
- class SoftSPI – bus SPI emulato via software
- class I2C – un protocollo seriale a due fili
- class SoftI2C – bus I2C emulato via software
- class I2CTarget – un dispositivo target I2C
- classe I2S – protocollo del bus Inter-IC Sound
- classe CAN – protocollo Controller Area Network
- class RTC – orologio in tempo reale
- class Timer – timer virtuale periodico / one-shot
- classe WDT – watchdog timer
- class SDCard – driver per schede SD / MMC
- class Counter – contatore di impulsi
- class Encoder – decodificatore in quadratura