klasa StateMachine – pristup programabilnom ulazno/izlaznom sučelju RP2040

Klasa StateMachine omogućuje pristup PIO (programabilnom ulazu/izlazu) sučelju RP2040.

Za sastavljanje PIO programa pogledajte rp2.asm_pio().

Konstruktori

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

Dohvaća stroj stanja označen s id. RP2040 ima dvije identične PIO instance, svaku s 4 stroja stanja: dakle ukupno postoji 8 strojeva stanja, označenih od 0 do 7.

Po želji ga inicijalizirajte zadanim programom program: pogledajte 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

Konfigurira instancu stroja stanja za pokretanje zadanog programa program.

Program se dodaje u memoriju instrukcija ove PIO instance. Ako memorija instrukcija već sadrži ovaj program, njegov se odmak ponovno koristi kako bi se uštedjelo na memoriji instrukcija.

  • freq je frekvencija u Hz na kojoj će se pokrenuti stroj stanja. Zadano je na frekvenciju sistemskog takta.

    Djelitelj takta računa se kao system clock frequency / freq, pa može doći do manjih pogrešaka zaokruživanja.

    Najmanji mogući djelitelj takta je 65536-ina sistemskog takta: tako da je pri zadanoj frekvenciji sistemskog takta od 125MHz najmanja vrijednost freq 1908. Za pokretanje strojeva stanja na sporijim frekvencijama morat ćete smanjiti brzinu sistemskog takta s machine.freq().

  • in_base je prvi pin koji se koristi za instrukcije in().

  • out_base je prvi pin koji se koristi za instrukcije out().

  • set_base je prvi pin koji se koristi za instrukcije set().

  • jmp_pin je prvi pin koji se koristi za instrukcije jmp(pin, ...).

  • sideset_base je prvi pin koji se koristi za side-setting.

  • in_shiftdir je smjer u kojem će ISR pomicati, ili PIO.SHIFT_LEFT ili PIO.SHIFT_RIGHT.

  • out_shiftdir je smjer u kojem će OSR pomicati, ili PIO.SHIFT_LEFT ili PIO.SHIFT_RIGHT.

  • push_thresh je prag u bitovima prije nego se aktivira automatsko guranje (push) ili uvjetno ponovno guranje.

  • pull_thresh je prag u bitovima prije nego se aktivira automatsko povlačenje (pull) ili uvjetno ponovno povlačenje.

Napomena: pinovi koji se koriste za in_base moraju se ručno konfigurirati za ulaz (ili drugačije) kako bi PIO mogao vidjeti željeni signal (mogu biti ulazni pinovi, izlazni pinovi ili spojeni na drugu periferiju). jmp_pin se također može ručno konfigurirati, no zadano će biti ulazni pin.

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

Dohvaća ili postavlja je li stroj stanja trenutno pokrenut.

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

Ponovno pokreće stroj stanja i skače na početak programa.

Ova metoda briše unutarnje stanje stroja stanja koristeći registar SM_RESTART RP2040. To uključuje:

  • brojače ulaznog i izlaznog pomaka

  • sadržaj ulaznog posmačnog registra

  • brojač kašnjenja

  • stanje čekanja na IRQ

  • zaustavljenu instrukciju pokrenutu pomoću StateMachine.exec()

exec(instr: str | int) None

Izvršava jednu PIO instrukciju.

Ako je instr niz, tada koristi asm_pio_encode za kodiranje instrukcije iz zadanog niza.

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

Ako je instr cijeli broj, tada se tretira kao već kodirana instrukcija strojnog koda PIO-a koja se izvršava.

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

Povlači riječ iz RX FIFO-a stroja stanja.

Ako je FIFO prazan, blokira dok podaci ne stignu (tj. dok stroj stanja ne gurne riječ).

Vrijednost se pomiče udesno za shift bitova prije vraćanja, tj. povratna vrijednost je word >> shift.

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

Gura riječi u TX FIFO stroja stanja.

value može biti cijeli broj, polje tipa B, H ili I, ili bytearray.

Ova metoda će blokirati dok sve riječi ne budu zapisane u FIFO. Ako je FIFO pun ili postane pun, metoda će blokirati dok stroj stanja ne povuče dovoljno riječi da dovrši zapisivanje.

Svaka riječ se najprije pomiče ulijevo za shift bitova, tj. stroj stanja prima word << shift.

rx_fifo() int

Vraća broj riječi u RX FIFO-u stroja stanja. Vrijednost 0 označava da je FIFO prazan.

Korisno za provjeru čekaju li podaci na čitanje, prije poziva StateMachine.get().

tx_fifo() int

Vraća broj riječi u TX FIFO-u stroja stanja. Vrijednost 0 označava da je FIFO prazan.

Korisno za provjeru ima li mjesta za guranje još jedne riječi pomoću StateMachine.put().

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

Vraća IRQ objekt za zadani StateMachine.

Po želji ga konfigurira.

Protokol međuspremnika

Klasa StateMachine podržava buffer protocol, omogućujući izravan pristup odašiljačkim i prijemnim FIFO-ima za svaki stroj stanja. To je prvenstveno radi omogućavanja da se objekti StateMachine proslijede izravno kao parametri čitanja ili pisanja pri konfiguriranju rp2.DMA() kanala.