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.