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