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에는0과1로 번호가 매겨진 두 개의 PIO 블록이 있습니다. 다른 id의 경우ValueError를 발생시킵니다.메서드¶
- gpio_base(base: machine.Pin | int | None = None, /) int¶
이 PIO 블록의 GPIO 베이스를 가져오거나 설정합니다.
RP2040 PIO는 GPIO 공간에 대한 32핀 윈도우를 봅니다. 이 윈도우는 GPIO0 또는 GPIO16에서 시작할 수 있습니다. 베이스는 이 PIO의 모든 상태 머신에 대해 어떤 윈도우가 적용되는지를 제어합니다.
인수가 없으면 현재 베이스(GPIO 핀 번호인
0또는16)를 반환합니다.인수가 있으면 베이스를 설정합니다.
base는machine.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는 로컬 상태 머신 인덱스(0–3)입니다.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을 유지하는 입력으로 시작하도록 합니다.
- 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_TX: int¶
asm_pio()의fifo_join에 전달하여 RX FIFO를 흡수함으로써 TX FIFO가 8워드로 두 배가 되도록 합니다. 상태 머신은 더 이상 데이터를 수신할 수 없습니다.