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_base 는
in()명령어에 사용할 첫 번째 핀입니다.out_base 는
out()명령어에 사용할 첫 번째 핀입니다.set_base 는
set()명령어에 사용할 첫 번째 핀입니다.jmp_pin 은
jmp(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()을 사용하여 또 다른 워드를 푸시할 공간이 있는지 확인하는 데 유용합니다.
버퍼 프로토콜¶
StateMachine 클래스는 buffer protocol 을 지원하여 각 상태 머신의 송신 및 수신 FIFO에 직접 접근할 수 있게 합니다. 이는 주로 rp2.DMA() 채널을 구성할 때 StateMachine 객체를 읽기 또는 쓰기 매개변수로 직접 전달할 수 있도록 하기 위한 것입니다.