machine --- fungsi-fungsi terkait perangkat keras

Modul machine berisi fungsi-fungsi khusus terkait perangkat keras pada papan tertentu. Sebagian besar fungsi dalam modul ini memungkinkan akses langsung dan tidak terbatas ke serta kontrol atas blok perangkat keras pada suatu sistem (seperti CPU, timer, bus, dll.).

Akses memori

Modul ini mengekspos tiga objek yang dapat di-subscript yang digunakan untuk akses memori mentah. Setiap objek berperilaku seperti array jarang yang diindeks oleh alamat byte: value = memN[addr] membaca, memN[addr] = value menulis. Alamat selalu merupakan alamat byte, terlepas dari lebar akses.

machine.mem8

Pengakses memori 8-bit yang dapat di-subscript. mem8[addr] membaca int dalam rentang 0-255 dari byte di addr; mem8[addr] = value menulis 8 bit rendah dari value. addr harus sejajar dengan 1 byte (alamat mana pun).

machine.mem16

Pengakses memori 16-bit (halfword) yang dapat di-subscript. mem16[addr] membaca int dalam rentang 0-65535; mem16[addr] = value menulis 16 bit rendah. addr harus sejajar dengan 2 byte.

machine.mem32

Pengakses memori 32-bit (word) yang dapat di-subscript. mem32[addr] membaca int dalam rentang 0-0xFFFFFFFF; mem32[addr] = value menulis 32 bit rendah. addr harus sejajar dengan 4 byte.

Contoh penggunaan (register bersifat khusus untuk mikrokontroler STM32H7 -- pada OpenMV Cam H7 / H7 Plus / Pure Thermal pin header P0 terhubung ke 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

Fungsi-fungsi lain-lain

machine.unique_id() bytes

Mengembalikan objek bytes yang berisi pengidentifikasi unik untuk papan ini. Nilainya dibaca dari perangkat keras MCU (biasanya nomor seri perangkat yang diprogram di pabrik), sehingga stabil di seluruh reboot dan berbeda dari satu papan ke papan lainnya.

Panjangnya bergantung pada keluarga MCU -- 12 byte pada STM32, 8 byte pada port mimxrt dan alif. Jika aplikasi Anda memerlukan ID dengan panjang tetap, potong atau hash nilai yang dikembalikan.

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

Mengukur lebar satu pulsa pada pin dan mengembalikan durasinya dalam mikrodetik.

pin harus dikonfigurasi sebagai input digital.

pulse_level adalah polaritas pulsa yang dihitung waktunya: 1 untuk pulsa tinggi, 0 untuk pulsa rendah.

Fungsi bekerja dalam dua fase. Pertama, jika pin belum berada di pulse_level, fungsi menunggu pin berpindah ke pulse_level (awal pulsa). Kemudian mengukur waktu pin tetap di pulse_level sebelum berpindah kembali (akhir pulsa). Waktu yang diukur dikembalikan dalam mikrodetik.

timeout_us membatasi setiap fase secara independen (sehingga panggilan kasus terburuk berlangsung hingga 2 * timeout_us). Saat timeout, fungsi mengembalikan nilai negatif yang mengidentifikasi fase mana yang mengalami timeout:

  • -2 -- timeout menunggu tepi depan (pin tidak pernah mencapai pulse_level).

  • -1 -- timeout menunggu tepi belakang (pulsa lebih panjang dari timeout_us).

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

Mentransmisikan data dengan bit-banging pada pin yang ditentukan. Argumen encoding menentukan cara bit dikodekan, dan timing adalah spesifikasi timing khusus encoding.

Encoding yang didukung adalah:

  • 0 untuk modulasi durasi pulsa "high low". Ini akan mentransmisikan bit 0 dan 1 sebagai pulsa berdurasi tertentu, dimulai dari bit paling signifikan. timing harus berupa empat-tuple nanosecond dalam format (high_time_0, low_time_0, high_time_1, low_time_1). Misalnya, (400, 850, 800, 450) adalah spesifikasi timing untuk LED RGB WS2812 pada 800kHz.

Akurasi timing bergantung pada perangkat keras; MCU yang lebih cepat menghasilkan pulsa yang lebih ketat (biasanya puluhan nanodetik).

Catatan

Untuk mengontrol strip WS2812 / NeoPixel, lihat modul neopixel untuk API tingkat yang lebih tinggi.

Konstanta

Konstanta di bawah ini dikembalikan oleh reset_cause() dan mengidentifikasi mengapa MCU terakhir kali direset. Tersedia pada port STM32 dan mimxrt; port alif (OpenMV Cam AE3) saat ini tidak mengekspos konstanta penyebab reset dan reset_cause()-nya selalu mengembalikan 0.

machine.PWRON_RESET: int

Reset yang disebabkan oleh daya yang diberikan ke chip. Port STM32 dan mimxrt.

machine.WDT_RESET: int

Reset yang disebabkan oleh watchdog timer yang kedaluwarsa. Port STM32 dan mimxrt.

machine.SOFT_RESET: int

Reset yang disebabkan oleh soft_reset() (interpreter Python dimulai ulang tanpa hard reset). Port STM32 dan mimxrt.

machine.HARD_RESET: int

Reset yang disebabkan oleh pin NRST yang diaktifkan (tombol reset eksternal). Hanya port STM32.

machine.DEEPSLEEP_RESET: int

Reset yang disebabkan oleh wake dari deep-sleep. Hanya port STM32.

Kelas-kelas