kelas StateMachine -- akses ke antarmuka I/O terprogram RP2040

Kelas StateMachine memberikan akses ke antarmuka PIO (programmable I/O) RP2040.

Untuk merakit program PIO, lihat rp2.asm_pio().

Konstruktor

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

Mendapatkan mesin status bernomor id. RP2040 memiliki dua instans PIO yang identik, masing-masing dengan 4 mesin status: sehingga ada 8 mesin status secara total, bernomor 0 hingga 7.

Opsional menginisialisasinya dengan program yang diberikan program: lihat StateMachine.init.

init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None

Mengonfigurasi instans mesin status untuk menjalankan program yang diberikan.

Program ditambahkan ke memori instruksi instans PIO ini. Jika memori instruksi sudah berisi program ini, maka offsetnya digunakan kembali untuk menghemat memori instruksi.

  • freq adalah frekuensi dalam Hz untuk menjalankan mesin status. Default ke frekuensi clock sistem.

    Pembagi clock dihitung sebagai system clock frequency / freq, sehingga mungkin ada sedikit kesalahan pembulatan.

    Pembagi clock minimum yang mungkin adalah satu per 65536 dari clock sistem: jadi pada frekuensi clock sistem default 125MHz, nilai minimum freq adalah 1908. Untuk menjalankan mesin status pada frekuensi lebih lambat, Anda perlu mengurangi kecepatan clock sistem dengan machine.freq().

  • in_base adalah pin pertama yang digunakan untuk instruksi in().

  • out_base adalah pin pertama yang digunakan untuk instruksi out().

  • set_base adalah pin pertama yang digunakan untuk instruksi set().

  • jmp_pin adalah pin pertama yang digunakan untuk instruksi jmp(pin, ...).

  • sideset_base adalah pin pertama yang digunakan untuk side-setting.

  • in_shiftdir adalah arah pergeseran ISR, baik PIO.SHIFT_LEFT atau PIO.SHIFT_RIGHT.

  • out_shiftdir adalah arah pergeseran OSR, baik PIO.SHIFT_LEFT atau PIO.SHIFT_RIGHT.

  • push_thresh adalah ambang batas dalam bit sebelum auto-push atau re-push kondisional dipicu.

  • pull_thresh adalah ambang batas dalam bit sebelum auto-pull atau re-pull kondisional dipicu.

Catatan: pin yang digunakan untuk in_base perlu dikonfigurasi secara manual untuk input (atau lainnya) agar PIO dapat melihat sinyal yang diinginkan (bisa berupa pin input, pin output, atau terhubung ke periferal berbeda). jmp_pin juga dapat dikonfigurasi secara manual, tetapi secara default akan menjadi pin input.

active(value: bool | int | None = None, /) bool

Mendapatkan atau mengatur apakah mesin status sedang berjalan.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

Memulai ulang mesin status dan melompat ke awal program.

Metode ini mengosongkan status internal mesin status menggunakan register SM_RESTART RP2040. Ini meliputi:

  • penghitung pergeseran input dan output

  • isi dari register pergeseran input

  • penghitung penundaan

  • status menunggu-pada-IRQ

  • instruksi yang terhenti dijalankan menggunakan StateMachine.exec()

exec(instr: str | int) None

Mengeksekusi satu instruksi PIO.

Jika instr adalah string maka menggunakan asm_pio_encode untuk mengenkode instruksi dari string yang diberikan.

>>> sm.exec("set(0, 1)")

Jika instr adalah integer maka diperlakukan sebagai instruksi kode mesin PIO yang sudah dikodekan untuk dieksekusi.

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

Menarik sebuah kata dari RX FIFO mesin status.

Jika FIFO kosong, ia memblokir hingga data tiba (yaitu mesin status mendorong sebuah kata).

Nilai digeser ke kanan sebesar bit shift sebelum dikembalikan, yaitu nilai kembalian adalah word >> shift.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

Mendorong kata-kata ke TX FIFO mesin status.

value dapat berupa integer, array bertipe B, H atau I, atau sebuah bytearray.

Metode ini akan memblokir hingga semua kata telah ditulis ke FIFO. Jika FIFO penuh atau menjadi penuh, metode akan memblokir hingga mesin status menarik cukup kata untuk menyelesaikan penulisan.

Setiap kata pertama digeser ke kiri sebesar bit shift, yaitu mesin status menerima word << shift.

rx_fifo() int

Mengembalikan jumlah kata dalam RX FIFO mesin status. Nilai 0 menunjukkan FIFO kosong.

Berguna untuk memeriksa apakah data sedang menunggu untuk dibaca, sebelum memanggil StateMachine.get().

tx_fifo() int

Mengembalikan jumlah kata dalam TX FIFO mesin status. Nilai 0 menunjukkan FIFO kosong.

Berguna untuk memeriksa apakah ada ruang untuk mendorong kata lain menggunakan StateMachine.put().

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

Mengembalikan objek IRQ untuk StateMachine yang diberikan.

Opsional mengonfigurasinya.

Protokol buffer

Kelas StateMachine mendukung protokol buffer, yang memungkinkan akses langsung ke FIFO kirim dan terima untuk setiap state machine. Ini terutama untuk memungkinkan objek StateMachine diteruskan langsung sebagai parameter baca atau tulis saat mengonfigurasi saluran rp2.DMA().