machine — fonctions liées au matériel

Le module machine contient des fonctions spécifiques liées au matériel d’une carte particulière. La plupart des fonctions de ce module permettent d’obtenir un accès direct et non restreint au contrôle des blocs matériels d’un système (comme le CPU, les minuteurs, les bus, etc.).

Accès mémoire

Le module expose trois objets indexables utilisés pour l’accès mémoire brut. Chacun se comporte comme un tableau creux indexé par adresse d’octet : value = memN[addr] lit, memN[addr] = value écrit. L’adresse est toujours une adresse d’octet, quelle que soit la largeur d’accès.

machine.mem8

Accesseur mémoire 8 bits indexable. mem8[addr] lit un int dans la plage 0-255 depuis l’octet à addr ; mem8[addr] = value écrit les 8 bits de poids faible de value. addr doit être aligné sur 1 octet (toute adresse).

machine.mem16

Accesseur mémoire 16 bits (demi-mot) indexable. mem16[addr] lit un int dans la plage 0-65535 ; mem16[addr] = value écrit les 16 bits de poids faible. addr doit être aligné sur 2 octets.

machine.mem32

Accesseur mémoire 32 bits (mot) indexable. mem32[addr] lit un int dans la plage 0-0xFFFFFFFF ; mem32[addr] = value écrit les 32 bits de poids faible. addr doit être aligné sur 4 octets.

Exemple d’utilisation (les registres sont spécifiques à un microcontrôleur STM32H7 – sur l’OpenMV Cam H7 / H7 Plus / Pure Thermal, la broche d’en-tête P0 est câblée à 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

Fonctions diverses

machine.unique_id() bytes

Renvoie un objet bytes contenant un identifiant unique pour cette carte. La valeur est lue depuis le matériel du MCU (généralement le numéro de série de l’appareil programmé en usine), elle est donc stable d’un redémarrage à l’autre et diffère d’une carte à l’autre.

La longueur dépend de la famille de MCU – 12 octets sur STM32, 8 octets sur les ports mimxrt et alif. Si votre application a besoin d’un ID de longueur fixe, découpez ou hachez la valeur renvoyée.

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

Mesure la largeur d’une seule impulsion sur pin et renvoie sa durée en microsecondes.

pin doit être configurée comme entrée numérique.

pulse_level est la polarité de l’impulsion à chronométrer : 1 pour une impulsion haute, 0 pour une impulsion basse.

La fonction fonctionne en deux phases. D’abord, si la broche n’est pas déjà à pulse_level, elle attend que la broche passe à pulse_level (le début de l’impulsion). Ensuite, elle mesure le temps pendant lequel la broche reste à pulse_level avant de revenir (la fin de l’impulsion). Le temps mesuré est renvoyé en microsecondes.

timeout_us borne chaque phase indépendamment (de sorte qu’un appel dans le pire des cas dure jusqu’à 2 * timeout_us). En cas d’expiration du délai, la fonction renvoie une valeur négative identifiant quelle phase a expiré :

  • -2 – expiration en attendant le front montant (la broche n’a jamais atteint pulse_level).

  • -1 – expiration en attendant le front descendant (l’impulsion était plus longue que timeout_us).

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

Transmet data en bit-banging sur la pin spécifiée. L’argument encoding spécifie comment les bits sont encodés, et timing est une spécification de chronométrage propre à l’encodage.

Les encodages pris en charge sont :

  • 0 pour la modulation de durée d’impulsion « haut bas ». Cela transmettra les bits 0 et 1 sous forme d’impulsions chronométrées, en commençant par le bit de poids fort. Le timing doit être un quadruplet de nanosecondes au format (high_time_0, low_time_0, high_time_1, low_time_1). Par exemple, (400, 850, 800, 450) est la spécification de chronométrage pour les LED RGB WS2812 à 800kHz.

La précision du chronométrage dépend du matériel ; les MCU plus rapides produisent des impulsions plus précises (généralement des dizaines de nanosecondes).

Note

Pour contrôler les bandeaux WS2812 / NeoPixel, voir le module neopixel pour une API de plus haut niveau.

Constantes

Les constantes ci-dessous sont renvoyées par reset_cause() et identifient pourquoi le MCU s’est réinitialisé pour la dernière fois. Disponibles sur les ports STM32 et mimxrt ; le port alif (OpenMV Cam AE3) n’expose pas actuellement les constantes de cause de réinitialisation et son reset_cause() renvoie toujours 0.

machine.PWRON_RESET: int

Réinitialisation causée par la mise sous tension de la puce. Ports STM32 et mimxrt.

machine.WDT_RESET: int

Réinitialisation causée par l’expiration du minuteur de surveillance. Ports STM32 et mimxrt.

machine.SOFT_RESET: int

Réinitialisation causée par soft_reset() (l’interpréteur Python a redémarré sans réinitialisation matérielle). Ports STM32 et mimxrt.

machine.HARD_RESET: int

Réinitialisation causée par l’assertion de la broche NRST (bouton de réinitialisation externe). Ports STM32 uniquement.

machine.DEEPSLEEP_RESET: int

Réinitialisation causée par le réveil après un sommeil profond. Ports STM32 uniquement.

Classes