machine — funções relacionadas com o hardware

O módulo machine contém funções específicas relacionadas com o hardware de uma determinada placa. A maioria das funções neste módulo permitem obter acesso directo e irrestrito e controlo dos blocos de hardware de um sistema (como CPU, temporizadores, buses, etc.).

Acesso à memória

O módulo expõe três objectos subscritos utilizados para acesso directo à memória. Cada um comporta-se 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

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

machine.mem16

Acessor de memória de 16 bits (meia palavra) subscritível. mem16[addr] lê um int no intervalo 0-65535; mem16[addr] = value escreve os 16 bits menos significativos. addr deve estar alinhado a 2 bytes.

machine.mem32

Acessor de memória de 32 bits (palavra) subscritível. mem32[addr] lê um int no intervalo 0-0xFFFFFFFF; mem32[addr] = value escreve os 32 bits menos significativos. addr deve estar alinhado a 4 bytes.

Exemplo de utilização (os registos são específicos de um microcontrolador STM32H7 – na OpenMV Cam H7 / H7 Plus / Pure Thermal, o pino do cabeçalho P0 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

Devolve um objecto 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), pelo que é estável entre reinicializações e difere de uma placa para outra.

O comprimento depende da família do MCU – 12 bytes em STM32, 8 bytes nos ports mimxrt e alif. Se a sua aplicação necessitar de um ID de comprimento fixo, corte ou faça hash do valor devolvido.

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

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

pin deve estar configurado como entrada digital.

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

A função funciona em duas fases. Primeiro, se o pino não estiver já em pulse_level, aguarda que o pino transite para pulse_level (o início do pulso). Depois mede o tempo que o pino permanece em pulse_level antes de transitar de volta (o fim do pulso). O tempo medido é devolvido em microssegundos.

timeout_us limita cada fase independentemente (pelo que uma chamada no pior caso dura até 2 * timeout_us). Em caso de timeout, a função devolve um valor negativo identificando qual a fase que expirou:

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

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

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

Transmite data por 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 de duração de pulso «alto baixo». Isto transmitirá os bits 0 e 1 como pulsos temporizados, começando pelo bit mais significativo. O timing deve ser um tuplo de quatro nanosegundos 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 nanosegundos).

Nota

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

Constantes

As constantes abaixo são devolvidas por reset_cause() e identificam o motivo do último reset do MCU. Disponíveis nos ports STM32 e mimxrt; o port alif (OpenMV Cam AE3) não expõe actualmente constantes de causa de reset e o seu reset_cause() devolve sempre 0.

machine.PWRON_RESET: int

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

machine.WDT_RESET: int

Reset causado pela expiração do temporizador watchdog. Ports STM32 e mimxrt.

machine.SOFT_RESET: int

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

machine.HARD_RESET: int

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

machine.DEEPSLEEP_RESET: int

Reset causado por acordar do deep-sleep. Apenas ports STM32.

Classes