class StateMachine – RP2040의 프로그래머블 I/O 인터페이스에 대한 접근

StateMachine 클래스는 RP2040의 PIO(프로그래머블 I/O) 인터페이스에 대한 접근을 제공합니다.

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

생성자

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

id 번호의 상태 머신을 가져옵니다. RP2040에는 동일한 PIO 인스턴스가 두 개 있으며, 각각 4개의 상태 머신을 갖습니다. 따라서 총 8개의 상태 머신이 있으며 0부터 7까지 번호가 매겨집니다.

선택적으로 주어진 프로그램 program 으로 초기화합니다: StateMachine.init 을 참조하십시오.

init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None

주어진 program 을 실행하도록 상태 머신 인스턴스를 구성합니다.

프로그램은 이 PIO 인스턴스의 명령어 메모리에 추가됩니다. 명령어 메모리에 이미 이 프로그램이 포함되어 있으면, 명령어 메모리를 절약하기 위해 해당 오프셋을 재사용합니다.

  • freq 는 상태 머신을 실행할 주파수(Hz)입니다. 기본값은 시스템 클록 주파수입니다.

    클록 분주기는 system clock frequency / freq 로 계산되므로 약간의 반올림 오차가 있을 수 있습니다.

    가능한 최소 클록 분주기는 시스템 클록의 65536분의 1입니다. 따라서 기본 시스템 클록 주파수 125MHz에서 freq 의 최소값은 1908 입니다. 상태 머신을 더 느린 주파수로 실행하려면 machine.freq() 로 시스템 클록 속도를 낮춰야 합니다.

  • in_basein() 명령어에 사용할 첫 번째 핀입니다.

  • out_baseout() 명령어에 사용할 첫 번째 핀입니다.

  • set_baseset() 명령어에 사용할 첫 번째 핀입니다.

  • jmp_pinjmp(pin, ...) 명령어에 사용할 첫 번째 핀입니다.

  • sideset_base 는 사이드세팅에 사용할 첫 번째 핀입니다.

  • in_shiftdir 은 ISR이 시프트할 방향으로, PIO.SHIFT_LEFT 또는 PIO.SHIFT_RIGHT 중 하나입니다.

  • out_shiftdir 은 OSR이 시프트할 방향으로, PIO.SHIFT_LEFT 또는 PIO.SHIFT_RIGHT 중 하나입니다.

  • push_thresh 는 자동 푸시 또는 조건부 재푸시가 트리거되기 전의 비트 단위 임계값입니다.

  • pull_thresh 는 자동 풀 또는 조건부 재풀이 트리거되기 전의 비트 단위 임계값입니다.

참고: in_base 에 사용되는 핀은 PIO가 원하는 신호를 볼 수 있도록 입력(또는 그 외)으로 수동 구성해야 합니다(입력 핀, 출력 핀이거나 다른 주변장치에 연결될 수 있음). jmp_pin 도 수동으로 구성할 수 있지만, 기본적으로는 입력 핀이 됩니다.

active(value: bool | int | None = None, /) bool

상태 머신이 현재 실행 중인지 여부를 가져오거나 설정합니다.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

상태 머신을 재시작하고 프로그램의 시작 부분으로 점프합니다.

이 메서드는 RP2040의 SM_RESTART 레지스터를 사용하여 상태 머신의 내부 상태를 지웁니다. 여기에는 다음이 포함됩니다:

  • 입력 및 출력 시프트 카운터

  • 입력 시프트 레지스터의 내용

  • 지연 카운터

  • IRQ 대기 상태

  • StateMachine.exec() 을 사용하여 실행된 정지된 명령어

exec(instr: str | int) None

단일 PIO 명령어를 실행합니다.

instr 이 문자열이면 asm_pio_encode 를 사용하여 주어진 문자열에서 명령어를 인코딩합니다.

>>> sm.exec("set(0, 1)")

instr 이 정수이면 이미 인코딩된 PIO 머신 코드 명령어로 취급되어 실행됩니다.

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

상태 머신의 RX FIFO에서 워드를 가져옵니다.

FIFO가 비어 있으면 데이터가 도착할 때까지(즉, 상태 머신이 워드를 푸시할 때까지) 블록됩니다.

값은 반환되기 전에 shift 비트만큼 오른쪽으로 시프트됩니다. 즉, 반환값은 word >> shift 입니다.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

상태 머신의 TX FIFO에 워드를 푸시합니다.

value 는 정수, B, H 또는 I 타입의 배열, 또는 bytearray 일 수 있습니다.

이 메서드는 모든 워드가 FIFO에 기록될 때까지 블록됩니다. FIFO가 가득 차 있거나 가득 차게 되면, 상태 머신이 쓰기를 완료할 만큼 충분한 워드를 가져갈 때까지 메서드가 블록됩니다.

각 워드는 먼저 shift 비트만큼 왼쪽으로 시프트됩니다. 즉, 상태 머신은 word << shift 를 받습니다.

rx_fifo() int

상태 머신의 RX FIFO에 있는 워드의 개수를 반환합니다. 값이 0이면 FIFO가 비어 있음을 나타냅니다.

StateMachine.get() 을 호출하기 전에 읽기를 기다리는 데이터가 있는지 확인하는 데 유용합니다.

tx_fifo() int

상태 머신의 TX FIFO에 있는 워드의 개수를 반환합니다. 값이 0이면 FIFO가 비어 있음을 나타냅니다.

StateMachine.put() 을 사용하여 또 다른 워드를 푸시할 공간이 있는지 확인하는 데 유용합니다.

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

주어진 StateMachine에 대한 IRQ 객체를 반환합니다.

선택적으로 구성합니다.

버퍼 프로토콜

StateMachine 클래스는 buffer protocol 을 지원하여 각 상태 머신의 송신 및 수신 FIFO에 직접 접근할 수 있게 합니다. 이는 주로 rp2.DMA() 채널을 구성할 때 StateMachine 객체를 읽기 또는 쓰기 매개변수로 직접 전달할 수 있도록 하기 위한 것입니다.