machine — laitteistoon liittyvät funktiot

machine-moduuli sisältää tietyn levyn laitteistoon liittyviä funktioita. Useimmat tämän moduulin funktiot mahdollistavat suoran ja rajoittamattoman pääsyn järjestelmän laitteistolohkoihin (kuten suorittimeen, ajastimiin, väyliin jne.) ja niiden hallinnan.

Muistin käyttö

Moduuli tarjoaa kolme indeksoitavaa objektia raakaan muistin käyttöön. Kukin toimii kuten harva taulukko, joka indeksoidaan tavuosoitteen mukaan: value = memN[addr] lukee, memN[addr] = value kirjoittaa. Osoite on aina tavuosoite riippumatta käytön leveydestä.

machine.mem8

Indeksoitava 8-bittinen muistin lukija. mem8[addr] lukee int-arvon välillä 0-255 osoitteessa addr olevasta tavusta; mem8[addr] = value kirjoittaa arvon value alimmat 8 bittiä. addr on kohdistettava 1 tavuun (mikä tahansa osoite).

machine.mem16

Indeksoitava 16-bittinen (puolisana) muistin lukija. mem16[addr] lukee int-arvon välillä 0-65535; mem16[addr] = value kirjoittaa alimmat 16 bittiä. addr on kohdistettava 2 tavuun.

machine.mem32

Indeksoitava 32-bittinen (sana) muistin lukija. mem32[addr] lukee int-arvon välillä 0-0xFFFFFFFF; mem32[addr] = value kirjoittaa alimmat 32 bittiä. addr on kohdistettava 4 tavuun.

Esimerkkikäyttö (rekisterit ovat STM32H7-mikro-ohjaimelle erityisiä – OpenMV Cam H7 / H7 Plus / Pure Thermal -malleissa liitinnasta P0 on kytketty nastaan 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

Sekalaiset funktiot

machine.unique_id() bytes

Palauta bytes-objekti, joka sisältää tämän levyn yksilöllisen tunnisteen. Arvo luetaan MCU:n laitteistosta (tyypillisesti tehtaalla ohjelmoitu laitteen sarjanumero), joten se on vakaa uudelleenkäynnistysten yli ja eroaa levystä toiseen.

Pituus riippuu MCU-perheestä – 12 tavua STM32:lla, 8 tavua mimxrt- ja alif-porteissa. Jos sovelluksesi tarvitsee kiinteäpituisen tunnisteen, viipaloi tai tiivistä palautettu arvo.

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

Mittaa yksittäisen pulssin leveys nastassa pin ja palauta sen kesto mikrosekunteina.

pin on määritettävä digitaaliseksi tuloksi.

pulse_level on ajastettavan pulssin polariteetti: 1 korkealle pulssille, 0 matalalle pulssille.

Funktio toimii kahdessa vaiheessa. Ensin, jos nasta ei ole jo tilassa pulse_level, se odottaa nastan siirtymistä tilaan pulse_level (pulssin alku). Sitten se mittaa ajan, jonka nasta pysyy tilassa pulse_level ennen siirtymistä takaisin (pulssin loppu). Mitattu aika palautetaan mikrosekunteina.

timeout_us rajaa kunkin vaiheen erikseen (joten pahimmassa tapauksessa kutsu kestää enintään 2 * timeout_us). Aikakatkaisun yhteydessä funktio palauttaa negatiivisen arvon, joka ilmaisee, mikä vaihe aikakatkaistui:

  • -2 – aikakatkaistui odotettaessa nousevaa reunaa (nasta ei koskaan saavuttanut tilaa pulse_level).

  • -1 – aikakatkaistui odotettaessa laskevaa reunaa (pulssi oli pidempi kuin timeout_us).

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

Lähettää datan data nastaa pin bit-bangaamalla. Argumentti encoding määrittää, miten bitit koodataan, ja timing on koodaukseen liittyvä ajoitusmääritys.

Tuetut koodaukset ovat:

  • 0 ”high low” -pulssin keston modulaatiolle. Tämä lähettää 0- ja 1-bitit ajastettuina pulsseina alkaen merkitsevimmästä bitistä. timing-arvon on oltava neljän nanosekunnin monikko muodossa (high_time_0, low_time_0, high_time_1, low_time_1). Esimerkiksi (400, 850, 800, 450) on ajoitusmääritys WS2812 RGB -LEDeille 800 kHz:llä.

Ajoituksen tarkkuus on laitteistoriippuvaista; nopeammat MCU:t tuottavat tarkempia pulsseja (tyypillisesti kymmeniä nanosekunteja).

Muista

WS2812- / NeoPixel-nauhojen ohjaamiseen katso neopixel-moduuli, joka tarjoaa korkeamman tason API:n.

Vakiot

Alla olevat vakiot palauttaa reset_cause(), ja ne ilmaisevat, miksi MCU viimeksi nollautui. Saatavilla STM32- ja mimxrt-porteissa; alif-portti (OpenMV Cam AE3) ei tällä hetkellä tarjoa nollauksen syyn vakioita, ja sen reset_cause() palauttaa aina 0.

machine.PWRON_RESET: int

Nollaus, jonka aiheutti virran kytkeminen sirulle. STM32- ja mimxrt-portit.

machine.WDT_RESET: int

Nollaus, jonka aiheutti vahtikoira-ajastimen vanheneminen. STM32- ja mimxrt-portit.

machine.SOFT_RESET: int

Nollaus, jonka aiheutti soft_reset() (Python-tulkki käynnistyi uudelleen ilman laitteistonollausta). STM32- ja mimxrt-portit.

machine.HARD_RESET: int

Nollaus, jonka aiheutti NRST-nastan aktivointi (ulkoinen nollauspainike). Vain STM32-portit.

machine.DEEPSLEEP_RESET: int

Nollaus, jonka aiheutti herääminen syväunesta. Vain STM32-portit.

Luokat