machine — funktioner relaterade till hårdvaran

Modulen machine innehåller specifika funktioner relaterade till hårdvaran på ett visst kort. De flesta funktionerna i denna modul gör det möjligt att uppnå direkt och obegränsad åtkomst till och kontroll av hårdvarublock i ett system (som CPU, timers, bussar, etc.).

Minnesåtkomst

Modulen exponerar tre indexerbara objekt som används för rå minnesåtkomst. Var och en beter sig som en gles array indexerad efter byteadress: value = memN[addr] läser, memN[addr] = value skriver. Adressen är alltid en byteadress, oavsett åtkomstbredd.

machine.mem8

Indexerbar 8-bitars minnesåtkomst. mem8[addr] läser en int i intervallet 0-255 från byten vid addr; mem8[addr] = value skriver de låga 8 bitarna av value. addr måste vara justerad till 1 byte (valfri adress).

machine.mem16

Indexerbar 16-bitars (halvord) minnesåtkomst. mem16[addr] läser en int i intervallet 0-65535; mem16[addr] = value skriver de låga 16 bitarna. addr måste vara justerad till 2 byte.

machine.mem32

Indexerbar 32-bitars (ord) minnesåtkomst. mem32[addr] läser en int i intervallet 0-0xFFFFFFFF; mem32[addr] = value skriver de låga 32 bitarna. addr måste vara justerad till 4 byte.

Exempelanvändning (registren är specifika för en STM32H7-mikrokontroller – på OpenMV Cam H7 / H7 Plus / Pure Thermal är header-stiftet P0 kopplat till 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 funktioner

machine.unique_id() bytes

Returnera ett bytes-objekt som innehåller en unik identifierare för detta kort. Värdet läses ut från MCU:ns hårdvara (vanligtvis det fabriksprogrammerade enhetsserienumret), så det är stabilt mellan omstarter och skiljer sig från ett kort till nästa.

Längden beror på MCU-familjen – 12 byte på STM32, 8 byte på mimxrt- och alif-portarna. Om din applikation behöver ett ID med fast längd, skiva eller hasha det returnerade värdet.

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

Mät bredden på en enstaka puls på pin och returnera dess varaktighet i mikrosekunder.

pin måste vara konfigurerad som en digital ingång.

pulse_level är pulspolariteten som ska tidsmätas: 1 för en hög puls, 0 för en låg puls.

Funktionen arbetar i två faser. Först, om stiftet inte redan är vid pulse_level, väntar den på att stiftet ska övergå till pulse_level (början av pulsen). Sedan mäter den tiden stiftet stannar vid pulse_level innan det övergår tillbaka (slutet av pulsen). Den uppmätta tiden returneras i mikrosekunder.

timeout_us begränsar varje fas oberoende (så ett värsta-fall-anrop varar upp till 2 * timeout_us). Vid timeout returnerar funktionen ett negativt värde som identifierar vilken fas som fick timeout:

  • -2 – timeout vid väntan på den ledande flanken (stiftet nådde aldrig pulse_level).

  • -1 – timeout vid väntan på den efterföljande flanken (pulsen var längre än timeout_us).

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

Sänder data genom bit-banging av det angivna pin. Argumentet encoding anger hur bitarna kodas, och timing är en kodningsspecifik tidsspecifikation.

De kodningar som stöds är:

  • 0 för pulslängdsmodulering av typen ”high low”. Detta sänder 0- och 1-bitar som tidsstyrda pulser, med början på den mest signifikanta biten. timing måste vara en fyr-tupel av nanosekunder i formatet (high_time_0, low_time_0, high_time_1, low_time_1). Till exempel är (400, 850, 800, 450) tidsspecifikationen för WS2812 RGB-lysdioder vid 800kHz.

Tidsprecisionen är hårdvaruberoende; snabbare MCU:er producerar tätare pulser (vanligtvis tiotals nanosekunder).

Anteckning

För att styra WS2812-/NeoPixel-remsor, se modulen neopixel för ett API på högre nivå.

Konstanter

Konstanterna nedan returneras av reset_cause() och identifierar varför MCU:n senast återställdes. Tillgängliga på STM32- och mimxrt-portarna; alif-porten (OpenMV Cam AE3) exponerar för närvarande inte konstanter för återställningsorsak och dess reset_cause() returnerar alltid 0.

machine.PWRON_RESET: int

Återställning orsakad av att ström tillförs chippet. STM32- och mimxrt-portarna.

machine.WDT_RESET: int

Återställning orsakad av att watchdog-timern löper ut. STM32- och mimxrt-portarna.

machine.SOFT_RESET: int

Återställning orsakad av soft_reset() (Python-interpretatorn startades om utan en hårdvaruåterställning). STM32- och mimxrt-portarna.

machine.HARD_RESET: int

Återställning orsakad av att NRST-stiftet aktiverats (extern återställningsknapp). Endast STM32-portarna.

machine.DEEPSLEEP_RESET: int

Återställning orsakad av uppvaknande från deep-sleep. Endast STM32-portarna.

Klasser