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)#

id ile tanımlanan PIO bloğu için tekil (singleton) PIO nesnesini döndürür. RP2040’ın iki PIO bloğu vardır; 0 ve 1 olarak numaralandırılmıştır. Başka herhangi bir id için ValueError yü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ı, 0 veya 16).

Bir argümanla, tabanı ayarlar. base bir machine.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. program belirtilmezse, 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 (03).

program sağ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 bu PIO örneğini alır; işleyicinin içinde, tetiklenen durum makineleri self.irq().flags() ifadesinin IRQ_SM* sabitleriyle VE’lenmesiyle belirlenebilir.

trigger, bir veya daha fazla IRQ_SM0 .. IRQ_SM3 değ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şlevinin out_init / set_init / sideset_init argü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şlevinin out_init / set_init / sideset_init argümanlarına geçirin; böylece pin, çıkış arabelleği 1 tutarken bir giriş olarak başlar.

OUT_LOW: int#

asm_pio() işlevinin out_init / set_init / sideset_init argü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şlevinin out_init / set_init / sideset_init argümanlarına geçirin; böylece pin, mantık 1’de sürülen bir çıkış olarak başlar.

SHIFT_LEFT: int#

asm_pio() veya StateMachine.init() işlevinin in_shiftdir / out_shiftdir argümanlarına geçirin; böylece kaydırmalar bitleri MSB’ye doğru taşır.

SHIFT_RIGHT: int#

asm_pio() veya StateMachine.init() işlevinin in_shiftdir / out_shiftdir argümanlarına geçirin; böylece kaydırmalar bitleri LSB’ye doğru taşır.

JOIN_NONE: int#

asm_pio() işlevinin fifo_join argü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şlevinin fifo_join argü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.

JOIN_RX: int#

asm_pio() işlevinin fifo_join argümanına geçirin; böylece RX FIFO, TX FIFO’yu emerek 8 sözcüğe iki katına çıkar. Durum makinesi artık veri gönderemez.

IRQ_SM0: int#

irq() trigger bayrağı: durum makinesi 0 IRQ’sunu yükseltti.

IRQ_SM1: int#

irq() trigger bayrağı: durum makinesi 1 IRQ’sunu yükseltti.

IRQ_SM2: int#

irq() trigger bayrağı: durum makinesi 2 IRQ’sunu yükseltti.

IRQ_SM3: int#

irq() trigger bayrağı: durum makinesi 3 IRQ’sunu yükseltti.