rp2 --- chức năng đặc thù cho RP2040

Module rp2 chứa các hàm và lớp dành riêng cho RP2040, được sử dụng trong Raspberry Pi Pico.

Xem RP2040 Python datasheet để biết thêm thông tin, và pico-micropython-examples để xem mã ví dụ.

Các lệnh hợp ngữ PIO

Các máy trạng thái PIO được lập trình bằng ngôn ngữ hợp ngữ tùy chỉnh với chín lệnh PIO-machine cốt lõi. Trong MicroPython, các thủ tục hợp ngữ PIO được viết dưới dạng hàm Python với decorator @rp2.asm_pio(), và chúng sử dụng cú pháp Python. Các thủ tục như vậy hỗ trợ các biến và phép tính Python tiêu chuẩn, cũng như các hàm tùy chỉnh sau đây để mã hóa các lệnh PIO và điều khiển trình hợp dịch. Xem mục 3.4 của tài liệu kỹ thuật RP2040 để biết thêm chi tiết.

wrap_target()

Xác định vị trí nơi quá trình thực thi tiếp tục sau khi chương trình quay vòng. Theo mặc định, đây là điểm bắt đầu của thủ tục PIO.

wrap()

Xác định vị trí nơi chương trình kết thúc và quay vòng lại. Nếu chỉ thị này không được sử dụng thì nó sẽ được thêm tự động ở cuối thủ tục PIO. Việc quay vòng không tốn bất kỳ chu kỳ thực thi nào.

label(label)

Định nghĩa một nhãn có tên label tại vị trí hiện tại. label có thể là một chuỗi hoặc số nguyên.

word(instr, label=None)

Chèn một từ 16 bit tùy ý vào đầu ra đã được dịch hợp ngữ.

  • instr: giá trị 16 bit

  • label: nếu được cung cấp, tra cứu nhãn và thực hiện phép OR logic giữa giá trị của nhãn với instr

jmp(...)

Lệnh này có hai dạng:

jmp(label)
  • label: nhãn để nhảy đến một cách vô điều kiện

jmp(cond, label)
  • cond: điều kiện cần kiểm tra, một trong:

    • not_x, not_y: đúng nếu thanh ghi bằng không

    • x_dec, y_dec: đúng nếu thanh ghi khác không, và thực hiện giảm sau

    • x_not_y: đúng nếu X không bằng Y

    • pin: đúng nếu chân (pin) đầu vào được đặt

    • not_osre: đúng nếu OSR không trống (chưa đạt đến ngưỡng của nó)

  • label: nhãn để nhảy đến nếu điều kiện đúng

wait(polarity, src, index)

Chặn, chờ đợi mức cao/thấp trên chân (pin) hoặc đường IRQ.

  • polarity: 0 hoặc 1, xác định có chờ giá trị thấp hay cao

  • src: một trong: gpio (chân tuyệt đối), pin (chân tương đối với đối số in_base của StateMachine), irq

  • index: 0-31, chỉ số cho src

in_(src, bit_count)

Dịch chuyển dữ liệu từ src vào ISR.

  • src: một trong: pins, x, y, null, isr, osr

  • bit_count: số bit cần dịch vào (1-32)

out(dest, bit_count)

Dịch chuyển dữ liệu từ OSR ra dest.

  • dest: một trong: pins, x, y, pindirs, pc, isr, exec

  • bit_count: số bit cần dịch ra (1-32)

push(...)

Đẩy ISR vào RX FIFO, sau đó xóa ISR về không. Lệnh này có các dạng sau:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

Nếu block được sử dụng thì lệnh sẽ dừng lại nếu RX FIFO đầy. Mặc định là chặn. Nếu iffull được sử dụng thì nó chỉ đẩy nếu số lần dịch đầu vào đã đạt đến ngưỡng của nó.

pull(...)

Kéo từ TX FIFO vào OSR. Lệnh này có các dạng sau:

  • pull()

  • pull(block)

  • pull(noblock)

  • pull(ifempty)

  • pull(ifempty, block)

  • pull(ifempty, noblock)

Nếu block được sử dụng thì lệnh sẽ dừng lại nếu TX FIFO trống. Mặc định là chặn. Nếu ifempty được sử dụng thì nó chỉ kéo nếu số lần dịch đầu ra đã đạt đến ngưỡng của nó.

mov(dest, src)

Di chuyển vào dest giá trị từ src.

  • dest: một trong: pins, x, y, exec, pc, isr, osr

  • src: một trong: pins, x, y, null, status, isr, osr; đối số này có thể được tùy chỉnh bằng cách bọc nó trong invert() hoặc reverse() (nhưng không phải cả hai cùng một lúc)

irq(...)

Đặt hoặc xóa cờ IRQ. Lệnh này có hai dạng:

irq(index)
  • index: 0-7, hoặc rel(0) đến rel(7)

irq(mode, index)
  • mode: một trong: block, clear

  • index: 0-7, hoặc rel(0) đến rel(7)

Nếu block được sử dụng thì lệnh sẽ dừng lại cho đến khi cờ được xóa bởi một thực thể khác. Nếu clear được sử dụng thì cờ sẽ được xóa thay vì được đặt. Chỉ số IRQ tương đối cộng ID máy trạng thái vào chỉ số IRQ với phép cộng modulo-4. IRQ 0-3 hiển thị từ bộ xử lý, 4-7 là nội bộ của các máy trạng thái.

set(dest, data)

Đặt dest với giá trị data.

  • dest: pins, x, y, pindirs

  • data: giá trị (0-31)

nop()

Đây là một lệnh giả được dịch hợp ngữ thành mov(y, y) và không có tác dụng phụ.

.side(value)

Đây là một modifier có thể áp dụng cho bất kỳ lệnh nào, và được sử dụng để điều khiển giá trị chân side-set.

  • value: giá trị (các bit) cần xuất ra trên các chân side-set

.delay(value)

Đây là một modifier có thể áp dụng cho bất kỳ lệnh nào, và xác định số chu kỳ cần trễ sau khi lệnh thực thi.

  • value: số chu kỳ trễ, 0-31 (giá trị tối đa giảm nếu các chân side-set được sử dụng)

[value]

Đây là một modifier và tương đương với .delay(value).

Các lớp