rp2 — RP2040 전용 기능¶
rp2 모듈에는 Raspberry Pi Pico에서 사용되는 RP2040 전용 함수와 클래스가 포함되어 있습니다.
자세한 내용은 RP2040 Python 데이터시트 를, 예제 코드는 pico-micropython-examples 를 참조하세요.
PIO 어셈블리 언어 명령¶
PIO 상태 머신은 아홉 개의 핵심 PIO 머신 명령을 갖춘 사용자 정의 어셈블리 언어로 프로그래밍됩니다. MicroPython에서 PIO 어셈블리 루틴은 @rp2.asm_pio() 데코레이터가 붙은 Python 함수로 작성되며 Python 구문을 사용합니다. 이러한 루틴은 표준 Python 변수와 산술 연산은 물론, PIO 명령을 인코딩하고 어셈블러를 지시하는 다음의 사용자 정의 함수도 지원합니다. 자세한 내용은 RP2040 데이터시트의 3.4절을 참조하세요.
- wrap_target()
프로그램 래핑 후 실행이 계속될 위치를 지정합니다. 기본값은 PIO 루틴의 시작 부분입니다.
- wrap()
프로그램이 끝나고 래핑되는 위치를 지정합니다. 이 지시문을 사용하지 않으면 PIO 루틴의 끝에 자동으로 추가됩니다. 래핑은 실행 사이클을 소모하지 않습니다.
- label(label)
현재 위치에 label 이라는 레이블을 정의합니다. label 은 문자열 또는 정수일 수 있습니다.
- word(instr, label=None)
어셈블된 출력에 임의의 16비트 워드를 삽입합니다.
instr: 16비트 값
label: 지정된 경우 레이블을 조회하여 레이블의 값과 instr 를 논리 OR 연산합니다
- jmp(…)
이 명령은 두 가지 형태를 취합니다:
- jmp(label)
label: 무조건 점프할 레이블
- jmp(cond, label)
cond: 확인할 조건으로, 다음 중 하나입니다:
not_x,not_y: 레지스터가 0이면 참x_dec,y_dec: 레지스터가 0이 아니면 참이며, 사후 감소를 수행합니다x_not_y: X가 Y와 같지 않으면 참pin: 입력 핀이 설정되어 있으면 참not_osre: OSR이 비어 있지 않으면(임계값에 도달하지 않았으면) 참
label: 조건이 참이면 점프할 레이블
- wait(polarity, src, index)
핀이나 IRQ 라인의 high/low를 기다리며 차단합니다.
polarity: 0 또는 1로, low 값을 기다릴지 high 값을 기다릴지 여부
src: 다음 중 하나:
gpio(절대 핀),pin(StateMachine의in_base인수에 상대적인 핀),irqindex: 0-31, src 에 대한 인덱스
- in_(src, bit_count)
src 에서 ISR로 데이터를 시프트해 넣습니다.
src: 다음 중 하나:
pins,x,y,null,isr,osrbit_count: 시프트해 넣을 비트 수 (1-32)
- out(dest, bit_count)
OSR에서 dest 로 데이터를 시프트해 내보냅니다.
dest: 다음 중 하나:
pins,x,y,pindirs,pc,isr,execbit_count: 시프트해 내보낼 비트 수 (1-32)
- push(…)
ISR을 RX FIFO로 푸시한 다음 ISR을 0으로 지웁니다. 이 명령은 다음 형태를 취합니다:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
block이 사용되면 RX FIFO가 가득 찼을 때 명령이 멈춥니다. 기본값은 차단입니다.iffull이 사용되면 입력 시프트 카운트가 임계값에 도달한 경우에만 푸시합니다.- pull(…)
TX FIFO에서 OSR로 풀합니다. 이 명령은 다음 형태를 취합니다:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
block이 사용되면 TX FIFO가 비어 있을 때 명령이 멈춥니다. 기본값은 차단입니다.ifempty가 사용되면 출력 시프트 카운트가 임계값에 도달한 경우에만 풀합니다.- mov(dest, src)
src 의 값을 dest 로 이동합니다.
dest: 다음 중 하나:
pins,x,y,exec,pc,isr,osrsrc: 다음 중 하나:
pins,x,y,null,status,isr,osr; 이 인수는invert()또는reverse()로 감싸서 선택적으로 수정할 수 있습니다(단, 둘을 함께 사용할 수는 없습니다)
- irq(…)
IRQ 플래그를 설정하거나 지웁니다. 이 명령은 두 가지 형태를 취합니다:
- irq(index)
index: 0-7, 또는
rel(0)부터rel(7)까지
- irq(mode, index)
mode: 다음 중 하나:
block,clearindex: 0-7, 또는
rel(0)부터rel(7)까지
block이 사용되면 플래그가 다른 엔티티에 의해 지워질 때까지 명령이 멈춥니다.clear가 사용되면 플래그가 설정되는 대신 지워집니다. 상대 IRQ 인덱스는 모듈로 4 덧셈으로 상태 머신 ID를 IRQ 인덱스에 더합니다. IRQ 0-3은 프로세서에서 볼 수 있으며, 4-7은 상태 머신 내부용입니다.- set(dest, data)
dest 를 값 data 로 설정합니다.
dest:
pins,x,y,pindirsdata: 값 (0-31)
- nop()
이것은
mov(y, y)로 어셈블되며 부작용이 없는 의사 명령입니다.- .side(value)
이것은 모든 명령에 적용할 수 있는 한정자로, side-set 핀 값을 제어하는 데 사용됩니다.
value: side-set 핀에 출력할 값(비트)
- .delay(value)
이것은 모든 명령에 적용할 수 있는 한정자로, 명령 실행 후 지연시킬 사이클 수를 지정합니다.
value: 지연시킬 사이클 수, 0-31 (side-set 핀이 사용되면 최대값이 감소함)
- [value]
이것은 한정자이며
.delay(value)와 동일합니다.