machine — funciones relacionadas con el hardware

El módulo machine contiene funciones específicas relacionadas con el hardware de una placa en particular. La mayoría de las funciones de este módulo permiten lograr un acceso y control directos y sin restricciones de los bloques de hardware de un sistema (como la CPU, los temporizadores, los buses, etc.).

Acceso a memoria

El módulo expone tres objetos suscriptables que se usan para el acceso a memoria sin procesar. Cada uno se comporta como un array disperso indexado por dirección de byte: value = memN[addr] lee, memN[addr] = value escribe. La dirección es siempre una dirección de byte, independientemente del ancho de acceso.

machine.mem8

Accesor de memoria suscriptable de 8 bits. mem8[addr] lee un int en el rango 0-255 del byte en addr; mem8[addr] = value escribe los 8 bits bajos de value. addr debe estar alineado a 1 byte (cualquier dirección).

machine.mem16

Accesor de memoria suscriptable de 16 bits (media palabra). mem16[addr] lee un int en el rango 0-65535; mem16[addr] = value escribe los 16 bits bajos. addr debe estar alineado a 2 bytes.

machine.mem32

Accesor de memoria suscriptable de 32 bits (palabra). mem32[addr] lee un int en el rango 0-0xFFFFFFFF; mem32[addr] = value escribe los 32 bits bajos. addr debe estar alineado a 4 bytes.

Ejemplo de uso (los registros son específicos de un microcontrolador STM32H7 – en la OpenMV Cam H7 / H7 Plus / Pure Thermal el pin de cabecera P0 está conectado a 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

Funciones varias

machine.unique_id() bytes

Devuelve un objeto bytes que contiene un identificador único de esta placa. El valor se lee del hardware del MCU (normalmente el número de serie del dispositivo programado de fábrica), por lo que es estable entre reinicios y difiere de una placa a otra.

La longitud depende de la familia del MCU – 12 bytes en STM32, 8 bytes en los puertos mimxrt y alif. Si tu aplicación necesita un ID de longitud fija, corta o aplica un hash al valor devuelto.

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

Mide el ancho de un único pulso en pin y devuelve su duración en microsegundos.

pin debe estar configurado como una entrada digital.

pulse_level es la polaridad del pulso a medir: 1 para un pulso alto, 0 para un pulso bajo.

La función funciona en dos fases. Primero, si el pin no está ya en pulse_level, espera a que el pin pase a pulse_level (el inicio del pulso). Luego mide el tiempo que el pin permanece en pulse_level antes de volver a cambiar (el final del pulso). El tiempo medido se devuelve en microsegundos.

timeout_us limita cada fase de forma independiente (de modo que una llamada en el peor de los casos dura hasta 2 * timeout_us). Si se agota el tiempo de espera, la función devuelve un valor negativo que identifica qué fase agotó su tiempo:

  • -2 – se agotó el tiempo esperando el flanco de subida (el pin nunca alcanzó pulse_level).

  • -1 – se agotó el tiempo esperando el flanco de bajada (el pulso fue más largo que timeout_us).

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

Transmite data mediante bit-banging en el pin especificado. El argumento encoding especifica cómo se codifican los bits, y timing es una especificación de temporización específica de la codificación.

Las codificaciones admitidas son:

  • 0 para la modulación de duración de pulso «alto bajo». Esto transmitirá los bits 0 y 1 como pulsos temporizados, empezando por el bit más significativo. El timing debe ser una tupla de cuatro nanosegundos con el formato (high_time_0, low_time_0, high_time_1, low_time_1). Por ejemplo, (400, 850, 800, 450) es la especificación de temporización para los LED RGB WS2812 a 800kHz.

La precisión de la temporización depende del hardware; los MCU más rápidos producen pulsos más ajustados (normalmente decenas de nanosegundos).

Nota

Para controlar tiras WS2812 / NeoPixel, consulta el módulo neopixel para una API de más alto nivel.

Constantes

Las constantes siguientes son devueltas por reset_cause() e identifican por qué se reinició el MCU por última vez. Disponibles en los puertos STM32 y mimxrt; el puerto alif (OpenMV Cam AE3) no expone actualmente constantes de causa de reinicio y su reset_cause() siempre devuelve 0.

machine.PWRON_RESET: int

Reinicio causado por la aplicación de alimentación al chip. Puertos STM32 y mimxrt.

machine.WDT_RESET: int

Reinicio causado por la expiración del temporizador de vigilancia (watchdog). Puertos STM32 y mimxrt.

machine.SOFT_RESET: int

Reinicio causado por soft_reset() (el intérprete de Python se reinició sin un reinicio por hardware). Puertos STM32 y mimxrt.

machine.HARD_RESET: int

Reinicio causado por la activación del pin NRST (botón de reinicio externo). Solo puertos STM32.

machine.DEEPSLEEP_RESET: int

Reinicio causado por el despertar desde deep-sleep. Solo puertos STM32.

Clases