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 / freqolarak 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_LEFTya daPIO.SHIFT_RIGHTolur.out_shiftdir, OSR’nin kaydıracağı yöndür;
PIO.SHIFT_LEFTya daPIO.SHIFT_RIGHTolur.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_RESTARTyazmacı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_encodekullanı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 >> shiftolur.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Durum makinesinin TX FIFO’suna sözcükler iter.
value bir tam sayı,
B,HveyaItüründe bir dizi ya da birbytearrayolabilir.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 << shiftalı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.
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.