machine — funções relacionadas ao hardware

O módulo machine contém funções específicas relacionadas ao hardware de uma placa em particular. A maioria das funções deste módulo permite obter acesso e controle diretos e irrestritos a blocos de hardware de um sistema (como CPU, timers, barramentos, etc.).

Acesso à memória

O módulo expõe três objetos indexáveis usados para acesso bruto à memória. Cada um se comporta como um array esparso indexado por endereço de byte: value = memN[addr] lê, memN[addr] = value escreve. O endereço é sempre um endereço de byte, independentemente da largura de acesso.

machine.mem8

Acessador de memória de 8 bits indexável. mem8[addr] lê um int no intervalo 0-255 a partir do byte em addr; mem8[addr] = value escreve os 8 bits inferiores de value. addr deve estar alinhado em 1 byte (qualquer endereço).

machine.mem16

Acessador de memória de 16 bits (halfword) indexável. mem16[addr] lê um int no intervalo 0-65535; mem16[addr] = value escreve os 16 bits inferiores. addr deve estar alinhado em 2 bytes.

machine.mem32

Acessador de memória de 32 bits (word) indexável. mem32[addr] lê um int no intervalo 0-0xFFFFFFFF; mem32[addr] = value escreve os 32 bits inferiores. addr deve estar alinhado em 4 bytes.

Exemplo de uso (os registradores são específicos de um microcontrolador STM32H7 – nas OpenMV Cam H7 / H7 Plus / Pure Thermal, o pino P0 do header está ligado 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

Funções diversas

machine.unique_id() bytes

Retorna um objeto bytes contendo um identificador único para esta placa. O valor é lido do hardware do MCU (tipicamente o número de série do dispositivo programado de fábrica), de modo que é estável entre reinicializações e difere de uma placa para outra.

O comprimento depende da família do MCU – 12 bytes no STM32, 8 bytes nas portas mimxrt e alif. Se sua aplicação precisar de um ID de comprimento fixo, faça o slice ou o hash do valor retornado.

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

Mede a largura de um único pulso em pin e retorna sua duração em microssegundos.

pin deve estar configurado como uma entrada digital.

pulse_level é a polaridade do pulso a ser medida: 1 para um pulso alto, 0 para um pulso baixo.

A função funciona em duas fases. Primeiro, se o pino ainda não estiver em pulse_level, ela aguarda o pino fazer a transição para pulse_level (o início do pulso). Em seguida, ela mede o tempo em que o pino permanece em pulse_level antes de fazer a transição de volta (o fim do pulso). O tempo medido é retornado em microssegundos.

timeout_us limita cada fase de forma independente (de modo que, no pior caso, a chamada dura até 2 * timeout_us). Em caso de timeout, a função retorna um valor negativo identificando qual fase atingiu o timeout:

  • -2 – timeout aguardando a borda de subida (o pino nunca atingiu pulse_level).

  • -1 – timeout aguardando a borda de descida (o pulso foi mais longo do que timeout_us).

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

Transmite data fazendo bit-banging no pin especificado. O argumento encoding especifica como os bits são codificados, e timing é uma especificação de temporização específica da codificação.

As codificações suportadas são:

  • 0 para modulação por duração de pulso “high low”. Isso transmitirá os bits 0 e 1 como pulsos temporizados, começando pelo bit mais significativo. O timing deve ser uma tupla de quatro valores em nanossegundos no formato (high_time_0, low_time_0, high_time_1, low_time_1). Por exemplo, (400, 850, 800, 450) é a especificação de temporização para LEDs RGB WS2812 a 800kHz.

A precisão da temporização depende do hardware; MCUs mais rápidos produzem pulsos mais precisos (tipicamente dezenas de nanossegundos).

Nota

Para controlar fitas WS2812 / NeoPixel, veja o módulo neopixel para uma API de nível mais alto.

Constantes

As constantes abaixo são retornadas por reset_cause() e identificam por que o MCU foi resetado pela última vez. Disponíveis nas portas STM32 e mimxrt; a porta alif (OpenMV Cam AE3) atualmente não expõe constantes de causa de reset, e seu reset_cause() sempre retorna 0.

machine.PWRON_RESET: int

Reset causado pela aplicação de energia ao chip. Portas STM32 e mimxrt.

machine.WDT_RESET: int

Reset causado pela expiração do watchdog timer. Portas STM32 e mimxrt.

machine.SOFT_RESET: int

Reset causado por soft_reset() (o interpretador Python reiniciou sem um reset de hardware). Portas STM32 e mimxrt.

machine.HARD_RESET: int

Reset causado pela ativação do pino NRST (botão de reset externo). Apenas portas STM32.

machine.DEEPSLEEP_RESET: int

Reset causado pelo wake do deep-sleep. Apenas portas STM32.

Classes