machine — functies met betrekking tot de hardware

De machine-module bevat specifieke functies met betrekking tot de hardware op een bepaald board. De meeste functies in deze module bieden directe en onbeperkte toegang tot en controle over hardwareblokken in een systeem (zoals CPU, timers, bussen, enz.).

Geheugentoegang

De module biedt drie subscriptable objecten voor ruwe geheugentoegang. Elk gedraagt zich als een ijle array geïndexeerd op byte-adres: value = memN[addr] leest, memN[addr] = value schrijft. Het adres is altijd een byte-adres, ongeacht de toegangsbreedte.

machine.mem8

Subscriptable 8-bits geheugentoegang. mem8[addr] leest een int in het bereik 0-255 uit de byte op addr; mem8[addr] = value schrijft de onderste 8 bits van value. addr moet uitgelijnd zijn op 1 byte (elk adres).

machine.mem16

Subscriptable 16-bits (halfword) geheugentoegang. mem16[addr] leest een int in het bereik 0-65535; mem16[addr] = value schrijft de onderste 16 bits. addr moet uitgelijnd zijn op 2 bytes.

machine.mem32

Subscriptable 32-bits (word) geheugentoegang. mem32[addr] leest een int in het bereik 0-0xFFFFFFFF; mem32[addr] = value schrijft de onderste 32 bits. addr moet uitgelijnd zijn op 4 bytes.

Voorbeeldgebruik (registers zijn specifiek voor een STM32H7-microcontroller – op de OpenMV Cam H7 / H7 Plus / Pure Thermal is de headerpin P0 verbonden met 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

Diverse functies

machine.unique_id() bytes

Geeft een bytes-object terug met een unieke identifier voor dit board. De waarde wordt uitgelezen uit de hardware van de MCU (doorgaans het in de fabriek geprogrammeerde serienummer van het apparaat), dus deze is stabiel over herstarts en verschilt van board tot board.

De lengte hangt af van de MCU-familie – 12 bytes op STM32, 8 bytes op de mimxrt- en alif-ports. Als je applicatie een ID met vaste lengte nodig heeft, slice of hash dan de teruggegeven waarde.

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

Meet de breedte van een enkele puls op pin en geeft de duur ervan terug in microseconden.

pin moet als digitale ingang geconfigureerd zijn.

pulse_level is de te timen pulspolariteit: 1 voor een hoge puls, 0 voor een lage puls.

De functie werkt in twee fasen. Eerst, als de pin nog niet op pulse_level staat, wacht deze tot de pin overgaat naar pulse_level (het begin van de puls). Vervolgens meet deze de tijd dat de pin op pulse_level blijft voordat deze weer terugschakelt (het einde van de puls). De gemeten tijd wordt teruggegeven in microseconden.

timeout_us begrenst elke fase onafhankelijk (dus een worst-case aanroep duurt tot 2 * timeout_us). Bij een timeout geeft de functie een negatieve waarde terug die aangeeft welke fase de timeout veroorzaakte:

  • -2 – timeout bij het wachten op de stijgende flank (de pin bereikte nooit pulse_level).

  • -1 – timeout bij het wachten op de dalende flank (de puls was langer dan timeout_us).

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

Verstuurt data door middel van bit-banging op de gespecificeerde pin. Het argument encoding specificeert hoe de bits worden gecodeerd, en timing is een encoding-specifieke timingspecificatie.

De ondersteunde encodings zijn:

  • 0 voor “high low”-pulsduurmodulatie. Hiermee worden 0- en 1-bits verzonden als getimede pulsen, te beginnen met de meest significante bit. De timing moet een viertal nanoseconden zijn in het formaat (high_time_0, low_time_0, high_time_1, low_time_1). Bijvoorbeeld, (400, 850, 800, 450) is de timingspecificatie voor WS2812 RGB-LED’s op 800kHz.

De timingnauwkeurigheid is hardware-afhankelijk; snellere MCU’s produceren strakkere pulsen (doorgaans tientallen nanoseconden).

Notitie

Zie voor het aansturen van WS2812- / NeoPixel-strips de neopixel-module voor een API op hoger niveau.

Constanten

De onderstaande constanten worden teruggegeven door reset_cause() en geven aan waarom de MCU het laatst is gereset. Beschikbaar op de STM32- en mimxrt-ports; de alif-port (OpenMV Cam AE3) biedt momenteel geen resetoorzaak-constanten en zijn reset_cause() geeft altijd 0 terug.

machine.PWRON_RESET: int

Reset veroorzaakt doordat er voeding op de chip werd aangelegd. STM32- en mimxrt-ports.

machine.WDT_RESET: int

Reset veroorzaakt doordat de watchdog-timer verliep. STM32- en mimxrt-ports.

machine.SOFT_RESET: int

Reset veroorzaakt door soft_reset() (de Python-interpreter herstartte zonder een hardware-reset). STM32- en mimxrt-ports.

machine.HARD_RESET: int

Reset veroorzaakt doordat de NRST-pin werd geactiveerd (externe resetknop). Alleen STM32-ports.

machine.DEEPSLEEP_RESET: int

Reset veroorzaakt door het wakker worden uit deep-sleep. Alleen STM32-ports.

Klassen