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#