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.