class StateMachine – RP2040’ın programlanabilir G/Ç arayüzüne erişim

StateMachine sınıfı, RP2040’ın PIO (programlanabilir G/Ç) arayüzüne erişim sağlar.

PIO programlarını derlemek için bkz. rp2.asm_pio().

Kurucular

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

id ile numaralandırılan durum makinesini alır. RP2040’ın her biri 4 durum makinesine sahip iki özdeş PIO örneği vardır: yani toplamda 0’dan 7’ye kadar numaralandırılmış 8 durum makinesi bulunur.

İsteğe bağlı olarak verilen program programıyla başlatın: bkz. 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

Durum makinesi örneğini verilen program programını çalıştıracak şekilde yapılandırır.

Program, bu PIO örneğinin komut belleğine eklenir. Komut belleği zaten bu programı içeriyorsa, komut belleğinden tasarruf etmek için programın ofseti yeniden kullanılır.

  • freq, durum makinesinin çalıştırılacağı Hz cinsinden frekanstır. Varsayılan olarak sistem saat frekansıdır.

    Saat bölücü system clock frequency / freq olarak hesaplanır, dolayısıyla küçük yuvarlama hataları olabilir.

    Mümkün olan en küçük saat bölücü, sistem saatinin 65536’da biridir: yani 125MHz’lik varsayılan sistem saat frekansında freq değerinin en küçük değeri 1908‘dir. Durum makinelerini daha düşük frekanslarda çalıştırmak için sistem saat hızını machine.freq() ile azaltmanız gerekir.

  • in_base, in() komutları için kullanılacak ilk pindir.

  • out_base, out() komutları için kullanılacak ilk pindir.

  • set_base, set() komutları için kullanılacak ilk pindir.

  • jmp_pin, jmp(pin, ...) komutları için kullanılacak ilk pindir.

  • sideset_base, yan ayarlama (side-setting) için kullanılacak ilk pindir.

  • in_shiftdir, ISR’nin kaydıracağı yöndür; PIO.SHIFT_LEFT ya da PIO.SHIFT_RIGHT olur.

  • out_shiftdir, OSR’nin kaydıracağı yöndür; PIO.SHIFT_LEFT ya da PIO.SHIFT_RIGHT olur.

  • push_thresh, otomatik itme (auto-push) veya koşullu yeniden itmenin tetiklenmesinden önceki bit cinsinden eşiktir.

  • pull_thresh, otomatik çekme (auto-pull) veya koşullu yeniden çekmenin tetiklenmesinden önceki bit cinsinden eşiktir.

Not: in_base için kullanılan pinlerin, PIO’nun istenen sinyali görebilmesi için giriş (veya başka türlü) olarak elle yapılandırılması gerekir (bunlar giriş pinleri, çıkış pinleri olabilir veya farklı bir çevre birimine bağlı olabilir). jmp_pin de elle yapılandırılabilir, ancak varsayılan olarak bir giriş pini olacaktır.

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

Durum makinesinin şu anda çalışıp çalışmadığını alır veya ayarlar.

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

Durum makinesini yeniden başlatır ve programın başına atlar.

Bu yöntem, RP2040’ın SM_RESTART yazmacını kullanarak durum makinesinin dahili durumunu temizler. Buna şunlar dahildir:

  • giriş ve çıkış kaydırma sayaçları

  • giriş kaydırma yazmacının içeriği

  • gecikme sayacı

  • IRQ bekleme durumu

  • StateMachine.exec() kullanılarak çalıştırılan takılı kalmış bir komut

exec(instr: str | int) None

Tek bir PIO komutu çalıştırır.

instr bir dize ise, verilen dizeden komutu kodlamak için asm_pio_encode kullanır.

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

instr bir tam sayı ise, çalıştırılacak önceden kodlanmış bir PIO makine kodu komutu olarak ele alınır.

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

Durum makinesinin RX FIFO’sundan bir sözcük çeker.

FIFO boşsa, veri gelene kadar (yani durum makinesi bir sözcük itene kadar) bloke eder.

Değer, döndürülmeden önce shift bit sağa kaydırılır, yani dönüş değeri word >> shift olur.

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

Durum makinesinin TX FIFO’suna sözcükler iter.

value bir tam sayı, B, H veya I türünde bir dizi ya da bir bytearray olabilir.

Bu yöntem, tüm sözcükler FIFO’ya yazılana kadar bloke eder. FIFO doluysa veya dolarsa, yöntem durum makinesi yazmayı tamamlamak için yeterli sözcük çekene kadar bloke eder.

Her sözcük önce shift bit sola kaydırılır, yani durum makinesi word << shift alır.

rx_fifo() int

Durum makinesinin RX FIFO’sundaki sözcük sayısını döndürür. 0 değeri FIFO’nun boş olduğunu gösterir.

StateMachine.get() çağrılmadan önce okunmayı bekleyen veri olup olmadığını kontrol etmek için yararlıdır.

tx_fifo() int

Durum makinesinin TX FIFO’sundaki sözcük sayısını döndürür. 0 değeri FIFO’nun boş olduğunu gösterir.

StateMachine.put() kullanarak başka bir sözcük itmek için yer olup olmadığını kontrol etmek için yararlıdır.

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

Verilen StateMachine için IRQ nesnesini döndürür.

İsteğe bağlı olarak yapılandırın.

Arabellek protokolü

StateMachine sınıfı buffer protocol protokolünü destekler ve her durum makinesi için gönderme ve alma FIFO’larına doğrudan erişime izin verir. Bu, öncelikle bir rp2.DMA() kanalını yapılandırırken StateMachine nesnelerinin doğrudan okuma veya yazma parametreleri olarak geçirilebilmesini sağlamak içindir.