class PIO – 고급 PIO 사용법

PIO 클래스는 RP2040의 두 프로그래머블 I/O(PIO) 블록 중 하나를 래핑합니다. 각 PIO 블록에는 네 개의 독립적인 상태 머신이 공유하는 명령어 메모리(명령어 32개)와, 각 상태 머신에 대한 전용 FIFO 인터페이스 및 IRQ 컨트롤러가 포함되어 있습니다.

대부분의 스크립트는 StateMachine 을 통해 PIO와 상호작용합니다 – 이 클래스는 다음이 필요한 고급 사용 사례를 위한 것입니다:

  • add_program() / remove_program() 을 통해 프로그램을 명시적으로 로드하고 제거합니다.

  • gpio_base() 를 통해 칩의 32핀 윈도우에서 PIO의 GPIO 베이스를 이동합니다.

  • irq() 를 통해 블록 전체 IRQ 플래그에 후킹합니다.

PIO 프로그램 어셈블에 대해서는 rp2.asm_pio() 를 참조하십시오.

생성자

class rp2.PIO(id: int)

id 로 식별되는 PIO 블록에 대한 싱글턴 PIO 객체를 반환합니다. RP2040에는 01 로 번호가 매겨진 두 개의 PIO 블록이 있습니다. 다른 id의 경우 ValueError 를 발생시킵니다.

메서드

gpio_base(base: machine.Pin | int | None = None, /) int

이 PIO 블록의 GPIO 베이스를 가져오거나 설정합니다.

RP2040 PIO는 GPIO 공간에 대한 32핀 윈도우를 봅니다. 이 윈도우는 GPIO0 또는 GPIO16에서 시작할 수 있습니다. 베이스는 이 PIO의 모든 상태 머신에 대해 어떤 윈도우가 적용되는지를 제어합니다.

인수가 없으면 현재 베이스(GPIO 핀 번호인 0 또는 16)를 반환합니다.

인수가 있으면 베이스를 설정합니다. basemachine.Pin 인스턴스 또는 정수 핀 번호일 수 있으며, GPIO0 또는 GPIO16으로 해석되어야 합니다. 베이스는 이 PIO 블록에 프로그램이 추가되거나 상태 머신이 생성되기 전에 설정해야 합니다.

add_program(program: Callable) None

program 을 이 PIO의 명령어 메모리에 로드합니다. 결과로 생성된 메모리 레이아웃은 이 PIO 블록의 모든 상태 머신에서 재사용됩니다.

각 PIO에는 모든 프로그램이 공유하는 32개 명령어 분량의 프로그램 메모리만 있습니다. 새 프로그램이 들어가지 않으면 이 메서드는 OSError(ENOMEM) 을 발생시킵니다. 동일한 프로그램을 두 PIO 인스턴스 모두에 로드할 수 있지만, 각각 별도의 메모리 영역을 사용합니다.

remove_program(program: Callable | None = None, /) None

program 을 이 PIO의 명령어 메모리에서 제거하여 새 프로그램을 위한 공간을 확보합니다. program 이 생략되면 현재 이 PIO에 로드된 모든 프로그램이 제거됩니다.

로드되지 않은 프로그램을 제거하는 것은 아무 작업도 하지 않습니다(예외 없음).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

이 PIO 블록이 소유한 네 개의 StateMachine 인스턴스 중 하나를 반환합니다. id 는 로컬 상태 머신 인덱스(03)입니다.

program 이 제공되면 상태 머신이 이를 실행하도록 구성됩니다 – 모든 위치/키워드 인수는 StateMachine.init() 으로 전달됩니다.

예시:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

반환된 객체의 전역 상태 머신 ID는 pio_id * 4 + sm_id 입니다.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

이 PIO의 블록 레벨 IRQ를 가져오거나 구성합니다.

handler 는 요청된 상태 머신 IRQ 중 하나가 래치될 때 실행할 콜백입니다. 핸들러는 이 PIO 인스턴스를 유일한 인수로 받습니다. 핸들러 내부에서는 self.irq().flags()IRQ_SM* 상수와 AND 연산하여 발생한 상태 머신을 식별할 수 있습니다.

trigger 는 하나 이상의 IRQ_SM0 .. IRQ_SM3 비트마스크입니다. 기본값은 임의의 상태 머신에서 발생합니다.

hard=True 는 하드 인터럽트 핸들러를 등록합니다(콜백에서 힙 할당이 없음).

MicroPython은 각 PIO 블록에서 IRQ 0을 바인딩합니다. IRQ 1은 예약되어 있으며 Python에서 접근할 수 없습니다.

상수

IN_LOW: int

asm_pio()out_init / set_init / sideset_init 에 전달하여 핀이 로우로 구동되는 입력으로 시작하도록 합니다(즉, 출력 버퍼가 0을 유지하는 트라이스테이트).

IN_HIGH: int

asm_pio()out_init / set_init / sideset_init 에 전달하여 핀이 출력 버퍼가 1을 유지하는 입력으로 시작하도록 합니다.

OUT_LOW: int

asm_pio()out_init / set_init / sideset_init 에 전달하여 핀이 논리 0으로 구동되는 출력으로 시작하도록 합니다.

OUT_HIGH: int

asm_pio()out_init / set_init / sideset_init 에 전달하여 핀이 논리 1로 구동되는 출력으로 시작하도록 합니다.

SHIFT_LEFT: int

asm_pio() 또는 StateMachine.init()in_shiftdir / out_shiftdir 에 전달하여 시프트가 비트를 MSB 쪽으로 이동시키도록 합니다.

SHIFT_RIGHT: int

asm_pio() 또는 StateMachine.init()in_shiftdir / out_shiftdir 에 전달하여 시프트가 비트를 LSB 쪽으로 이동시키도록 합니다.

JOIN_NONE: int

asm_pio()fifo_join 에 전달하여 상태 머신이 별도의 4워드 TX 및 RX FIFO를 갖도록 합니다(기본값).

JOIN_TX: int

asm_pio()fifo_join 에 전달하여 RX FIFO를 흡수함으로써 TX FIFO가 8워드로 두 배가 되도록 합니다. 상태 머신은 더 이상 데이터를 수신할 수 없습니다.

JOIN_RX: int

asm_pio()fifo_join 에 전달하여 TX FIFO를 흡수함으로써 RX FIFO가 8워드로 두 배가 되도록 합니다. 상태 머신은 더 이상 데이터를 전송할 수 없습니다.

IRQ_SM0: int

irq() trigger 플래그: 상태 머신 0이 IRQ를 발생시켰습니다.

IRQ_SM1: int

irq() trigger 플래그: 상태 머신 1이 IRQ를 발생시켰습니다.

IRQ_SM2: int

irq() trigger 플래그: 상태 머신 2가 IRQ를 발생시켰습니다.

IRQ_SM3: int

irq() trigger 플래그: 상태 머신 3이 IRQ를 발생시켰습니다.