class PIO – gelişmiş PIO kullanımı¶
PIO sınıfı, RP2040’ın iki Programlanabilir G/Ç (PIO) bloğundan birini sarmalar. Her PIO bloğu, dört bağımsız durum makinesi tarafından paylaşılan bir komut belleği (32 komut), bunun yanı sıra her durum makinesine özel bir FIFO arayüzü ve bir IRQ denetleyicisi içerir.
Çoğu betik PIO ile StateMachine aracılığıyla etkileşir – bu sınıf, aşağıdakilere ihtiyaç duyan gelişmiş kullanım senaryoları içindir:
add_program()/remove_program()aracılığıyla programları açıkça yüklemek ve kaldırmak.PIO’nun GPIO tabanını yonganın 32 pinlik penceresi boyunca
gpio_base()ile taşımak.Blok genelindeki IRQ bayraklarına
irq()aracılığıyla bağlanmak.
PIO programlarını derlemek için bkz. rp2.asm_pio().
Kurucular¶
- class rp2.PIO(id: int)¶
idile tanımlanan PIO bloğu için tekil (singleton)PIOnesnesini döndürür. RP2040’ın iki PIO bloğu vardır;0ve1olarak numaralandırılmıştır. Başka herhangi bir id içinValueErroryükseltir.Yöntemler¶
- gpio_base(base: machine.Pin | int | None = None, /) int¶
Bu PIO bloğu için GPIO tabanını alır veya ayarlar.
RP2040 PIO, GPIO alanına 32 pinlik bir pencere görür; pencere GPIO0’da veya GPIO16’da başlayabilir. Taban, bu PIO üzerindeki tüm durum makineleri için hangi pencerenin geçerli olduğunu denetler.
Argüman verilmezse, geçerli tabanı döndürür (GPIO pin numarası,
0veya16).Bir argümanla, tabanı ayarlar.
basebirmachine.Pinörneği veya tam sayı pin numarası olabilir ve GPIO0 ya da GPIO16’ya çözümlenmelidir. Taban, bu PIO bloğunda herhangi bir program eklenmeden veya durum makinesi oluşturulmadan önce ayarlanmalıdır.
- add_program(program: Callable) None¶
programöğesini bu PIO’nun komut belleğine yükler. Sonuçta oluşan bellek düzeni, bu PIO bloğundaki tüm durum makineleri arasında yeniden kullanılır.Her PIO’nun tüm programlar arasında paylaşılan yalnızca 32 komutluk program belleği vardır; yeni program sığmazsa bu yöntem
OSError(ENOMEM)yükseltir. Aynı program her iki PIO örneğine de yüklenebilir, ancak ayrı bellek bölgeleri tüketir.
- remove_program(program: Callable | None = None, /) None¶
programöğesini bu PIO’nun komut belleğinden kaldırarak yeni programlar için yer açar.programbelirtilmezse, bu PIO’ya şu anda yüklü olan her program kaldırılır.Yüklü olmayan bir programı kaldırmak işlemsizdir (no-op) (istisna oluşmaz).
- state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine¶
Bu PIO bloğunun sahip olduğu dört
StateMachineörneğinden birini döndürür.id, yerel durum makinesi indeksidir (0–3).programsağlanırsa, durum makinesi onu çalıştıracak şekilde yapılandırılır – tüm konumsal/anahtar kelime argümanlarıStateMachine.init()işlevine iletilir.Örnek:
>>> rp2.PIO(1).state_machine(3) StateMachine(7)
Döndürülen nesnenin global durum makinesi ID’si
pio_id * 4 + sm_idşeklindedir.
- irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable¶
Bu PIO için blok düzeyindeki IRQ’yu alır veya yapılandırır.
handler, istenen durum makinesi IRQ’larından herhangi biri tetiklendiğinde çalıştırılacak geri çağırmadır (callback). İşleyici, tek argümanı olarak buPIOörneğini alır; işleyicinin içinde, tetiklenen durum makineleriself.irq().flags()ifadesininIRQ_SM*sabitleriyle VE’lenmesiyle belirlenebilir.trigger, bir veya daha fazlaIRQ_SM0..IRQ_SM3değerinden oluşan bir bit maskesidir. Varsayılan, herhangi bir durum makinesinde tetiklenir.hard=True, bir donanım kesmesi (hard-interrupt) işleyicisi kaydeder (geri çağırmada yığın ayırma yapılmaz).MicroPython her PIO bloğunda IRQ 0’ı bağlar; IRQ 1 ayrılmıştır ve Python’dan erişilemez.
Sabitler¶
- IN_LOW: int¶
asm_pio()işlevininout_init/set_init/sideset_initargümanlarına geçirin; böylece pin, düşük seviyeye sürülen bir giriş olarak başlar (yani çıkış arabelleği 0 tutarken üç durumlu/tristate).
- IN_HIGH: int¶
asm_pio()işlevininout_init/set_init/sideset_initargümanlarına geçirin; böylece pin, çıkış arabelleği 1 tutarken bir giriş olarak başlar.
- OUT_LOW: int¶
asm_pio()işlevininout_init/set_init/sideset_initargümanlarına geçirin; böylece pin, mantık 0’da sürülen bir çıkış olarak başlar.
- OUT_HIGH: int¶
asm_pio()işlevininout_init/set_init/sideset_initargümanlarına geçirin; böylece pin, mantık 1’de sürülen bir çıkış olarak başlar.
- SHIFT_LEFT: int¶
asm_pio()veyaStateMachine.init()işlevininin_shiftdir/out_shiftdirargümanlarına geçirin; böylece kaydırmalar bitleri MSB’ye doğru taşır.
- SHIFT_RIGHT: int¶
asm_pio()veyaStateMachine.init()işlevininin_shiftdir/out_shiftdirargümanlarına geçirin; böylece kaydırmalar bitleri LSB’ye doğru taşır.
- JOIN_NONE: int¶
asm_pio()işlevininfifo_joinargümanına geçirin; böylece durum makinesinin ayrı 4 sözcüklük TX ve RX FIFO’ları olur (varsayılan).
- JOIN_TX: int¶
asm_pio()işlevininfifo_joinargümanına geçirin; böylece TX FIFO, RX FIFO’yu emerek 8 sözcüğe iki katına çıkar. Durum makinesi artık veri alamaz.