kelas PIO -- penggunaan PIO tingkat lanjut

Kelas PIO membungkus salah satu dari dua blok Programmable I/O (PIO) RP2040. Setiap blok PIO berisi memori instruksi (32 instruksi) yang digunakan bersama oleh empat mesin status independen, ditambah antarmuka FIFO privat ke setiap mesin status dan sebuah kontroler IRQ.

Sebagian besar skrip berinteraksi dengan PIO melalui StateMachine -- kelas ini untuk kasus penggunaan tingkat lanjut yang perlu:

  • Memuat dan menghapus program secara eksplisit melalui add_program() / remove_program().

  • Memindahkan basis GPIO PIO melintasi jendela 32-pin chip melalui gpio_base().

  • Menghubungkan ke flag IRQ tingkat blok melalui irq().

Untuk merakit program PIO lihat rp2.asm_pio().

Konstruktor

class rp2.PIO(id: int)

Mengembalikan objek PIO singleton untuk blok PIO yang diidentifikasi oleh id. RP2040 memiliki dua blok PIO, bernomor 0 dan 1. Memunculkan ValueError untuk id lainnya.

Metode

gpio_base(base: machine.Pin | int | None = None, /) int

Mendapatkan atau mengatur basis GPIO untuk blok PIO ini.

PIO RP2040 melihat jendela 32-pin ke dalam ruang GPIO; jendela dapat dimulai dari GPIO0 atau GPIO16. Basis mengontrol jendela mana yang berlaku untuk semua mesin status pada PIO ini.

Tanpa argumen, mengembalikan basis saat ini (nomor pin GPIO, 0 atau 16).

Dengan argumen, mengatur basis. base dapat berupa instans machine.Pin atau nomor pin integer, dan harus mengarah ke GPIO0 atau GPIO16. Basis harus diatur sebelum program apa pun ditambahkan atau mesin status dibuat pada blok PIO ini.

add_program(program: Callable) None

Memuat program ke dalam memori instruksi PIO ini. Tata letak memori yang dihasilkan digunakan kembali di semua mesin status pada blok PIO ini.

Setiap PIO hanya memiliki 32 instruksi memori program yang digunakan bersama di semua program; jika program baru tidak muat, metode ini memunculkan OSError(ENOMEM). Program yang sama dapat dimuat ke kedua instans PIO, tetapi mereka menggunakan wilayah memori yang terpisah.

remove_program(program: Callable | None = None, /) None

Menghapus program dari memori instruksi PIO ini, membebaskan ruang untuk program baru. Jika program dihilangkan, setiap program yang saat ini dimuat pada PIO ini dihapus.

Menghapus program yang belum dimuat adalah no-op (tidak ada pengecualian).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Mengembalikan salah satu dari empat instans StateMachine yang dimiliki oleh blok PIO ini. id adalah indeks mesin status lokal (0 -- 3).

Jika program disediakan, mesin status dikonfigurasi untuk menjalankannya -- semua argumen posisional/kata kunci diteruskan ke StateMachine.init().

Contoh:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

ID mesin status global objek yang dikembalikan adalah pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Mendapatkan atau mengonfigurasi IRQ tingkat blok untuk PIO ini.

handler adalah callback yang dipicu ketika salah satu IRQ mesin status yang diminta terkunci. Handler menerima instans PIO ini sebagai satu-satunya argumennya; di dalam handler, mesin status yang memicu dapat diidentifikasi melalui self.irq().flags() yang di-AND dengan konstanta IRQ_SM*.

trigger adalah bitmask dari satu atau lebih IRQ_SM0 .. IRQ_SM3. Default dipicu pada mesin status mana pun.

hard=True mendaftarkan handler interupsi keras (tidak ada alokasi heap dalam callback).

MicroPython mengikat IRQ 0 pada setiap blok PIO; IRQ 1 dicadangkan dan tidak dapat diakses dari Python.

Konstanta

IN_LOW: int

Teruskan ke out_init / set_init / sideset_init dari asm_pio() agar pin dimulai sebagai input yang dikendalikan rendah (yaitu tristate dengan buffer output menahan 0).

IN_HIGH: int

Teruskan ke out_init / set_init / sideset_init dari asm_pio() agar pin dimulai sebagai input dengan buffer output menahan 1.

OUT_LOW: int

Teruskan ke out_init / set_init / sideset_init dari asm_pio() agar pin dimulai sebagai output yang dikemudikan pada logika 0.

OUT_HIGH: int

Teruskan ke out_init / set_init / sideset_init dari asm_pio() agar pin dimulai sebagai output yang dikemudikan pada logika 1.

SHIFT_LEFT: int

Teruskan ke in_shiftdir / out_shiftdir dari asm_pio() atau StateMachine.init() agar pergeseran memindahkan bit ke arah MSB.

SHIFT_RIGHT: int

Teruskan ke in_shiftdir / out_shiftdir dari asm_pio() atau StateMachine.init() agar pergeseran memindahkan bit ke arah LSB.

JOIN_NONE: int

Teruskan ke fifo_join dari asm_pio() agar mesin status memiliki TX dan RX FIFO 4-kata terpisah (default).

JOIN_TX: int

Teruskan ke fifo_join dari asm_pio() agar TX FIFO digandakan menjadi 8 kata dengan menyerap RX FIFO. Mesin status tidak dapat lagi menerima data.

JOIN_RX: int

Teruskan ke fifo_join dari asm_pio() agar RX FIFO digandakan menjadi 8 kata dengan menyerap TX FIFO. Mesin status tidak dapat lagi mengirim data.

IRQ_SM0: int

Flag trigger irq(): mesin status 0 memunculkan IRQ-nya.

IRQ_SM1: int

Flag trigger irq(): mesin status 1 memunculkan IRQ-nya.

IRQ_SM2: int

Flag trigger irq(): mesin status 2 memunculkan IRQ-nya.

IRQ_SM3: int

Flag trigger irq(): mesin status 3 memunculkan IRQ-nya.