machine --- các hàm liên quan đến phần cứng

Module machine chứa các hàm đặc thù liên quan đến phần cứng của một bo mạch cụ thể. Hầu hết các hàm trong module này cho phép truy cập trực tiếp và không bị hạn chế vào các khối phần cứng trên hệ thống (như CPU, bộ định thời, bus, v.v.).

Truy cập bộ nhớ

Module cung cấp ba đối tượng có thể đăng ký dùng để truy cập bộ nhớ thô. Mỗi đối tượng hoạt động như một mảng thưa được lập chỉ mục theo địa chỉ byte: value = memN[addr] để đọc, memN[addr] = value để ghi. Địa chỉ luôn là địa chỉ byte, bất kể độ rộng truy cập.

machine.mem8

Bộ truy cập bộ nhớ 8-bit có thể đăng ký. mem8[addr] đọc một int trong khoảng 0-255 từ byte tại addr; mem8[addr] = value ghi 8 bit thấp của value. addr phải căn chỉnh theo 1 byte (bất kỳ địa chỉ nào).

machine.mem16

Bộ truy cập bộ nhớ 16-bit (halfword) có thể đăng ký. mem16[addr] đọc một int trong khoảng 0-65535; mem16[addr] = value ghi 16 bit thấp. addr phải căn chỉnh theo 2 byte.

machine.mem32

Bộ truy cập bộ nhớ 32-bit (word) có thể đăng ký. mem32[addr] đọc một int trong khoảng 0-0xFFFFFFFF; mem32[addr] = value ghi 32 bit thấp. addr phải căn chỉnh theo 4 byte.

Ví dụ sử dụng (các thanh ghi dành riêng cho vi điều khiển STM32H7 -- trên OpenMV Cam H7 / H7 Plus / Pure Thermal, chân header P0 được nối với 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

Các hàm khác

machine.unique_id() bytes

Trả về một đối tượng bytes chứa định danh duy nhất cho bo mạch này. Giá trị được đọc từ phần cứng của MCU (thường là số seri thiết bị được lập trình tại nhà máy), do đó nó ổn định qua các lần khởi động lại và khác nhau giữa các bo mạch.

Độ dài phụ thuộc vào họ MCU -- 12 byte trên STM32, 8 byte trên các port mimxrt và alif. Nếu ứng dụng của bạn cần ID có độ dài cố định, hãy cắt hoặc băm giá trị trả về.

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

Đo độ rộng của một xung đơn trên pin và trả về thời gian của nó tính bằng micro giây.

pin phải được cấu hình như một đầu vào kỹ thuật số.

pulse_level là cực tính xung cần đo thời gian: 1 cho xung cao, 0 cho xung thấp.

Hàm hoạt động theo hai giai đoạn. Đầu tiên, nếu chân (pin) chưa ở pulse_level, nó chờ chân chuyển sang pulse_level (bắt đầu xung). Sau đó nó đo thời gian chân ở tại pulse_level trước khi chuyển trở lại (kết thúc xung). Thời gian đo được trả về tính bằng micro giây.

timeout_us giới hạn mỗi giai đoạn một cách độc lập (do đó một lệnh gọi trong trường hợp xấu nhất kéo dài đến 2 * timeout_us). Khi hết thời gian chờ, hàm trả về một giá trị âm xác định giai đoạn nào đã hết thời gian:

  • -2 -- hết thời gian chờ cạnh dẫn (chân (pin) không bao giờ đạt pulse_level).

  • -1 -- hết thời gian chờ cạnh cuối (xung dài hơn timeout_us).

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

Truyền data bằng cách bit-banging chân (pin) pin được chỉ định. Đối số encoding chỉ định cách các bit được mã hóa, và timing là thông số kỹ thuật thời gian đặc thù cho mã hóa.

Các mã hóa được hỗ trợ:

  • 0 cho điều chế thời lượng xung "high low". Điều này sẽ truyền các bit 0 và 1 dưới dạng các xung có thời gian, bắt đầu từ bit có nghĩa nhất. timing phải là một tuple bốn phần tử tính bằng nano giây theo định dạng (high_time_0, low_time_0, high_time_1, low_time_1). Ví dụ, (400, 850, 800, 450) là thông số kỹ thuật thời gian cho đèn LED RGB WS2812 ở 800kHz.

Độ chính xác thời gian phụ thuộc vào phần cứng; MCU nhanh hơn tạo ra các xung chặt chẽ hơn (thường hàng chục nano giây).

Ghi chú

Để điều khiển các dải WS2812 / NeoPixel, hãy xem module neopixel để có API cấp cao hơn.

Hằng số

Các hằng số dưới đây được trả về bởi reset_cause() và xác định lý do MCU reset lần cuối. Có sẵn trên các port STM32 và mimxrt; port alif (OpenMV Cam AE3) hiện không cung cấp hằng số nguyên nhân reset và reset_cause() của nó luôn trả về 0.

machine.PWRON_RESET: int

Reset do nguồn điện được cấp vào chip. Các port STM32 và mimxrt.

machine.WDT_RESET: int

Reset do bộ định thời watchdog hết hạn. Các port STM32 và mimxrt.

machine.SOFT_RESET: int

Reset do soft_reset() (trình thông dịch Python được khởi động lại mà không reset phần cứng). Các port STM32 và mimxrt.

machine.HARD_RESET: int

Reset do chân NRST được kéo xuống (nút reset bên ngoài). Chỉ các port STM32.

machine.DEEPSLEEP_RESET: int

Reset do thức dậy từ deep-sleep. Chỉ các port STM32.

Lớp