class StateMachine -- truy cập giao diện I/O lập trình của RP2040

Lớp StateMachine cung cấp quyền truy cập vào giao diện PIO (programmable I/O) của RP2040.

Để lắp ráp các chương trình PIO, xem rp2.asm_pio().

Constructors

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

Lấy state machine có số thứ tự id. RP2040 có hai thực thể PIO giống hệt nhau, mỗi thực thể có 4 state machine: vậy có tổng cộng 8 state machine, được đánh số từ 0 đến 7.

Tùy chọn khởi tạo nó với chương trình program đã cho: xem 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

Cấu hình thực thể state machine để chạy program đã cho.

Chương trình được thêm vào bộ nhớ lệnh của thực thể PIO này. Nếu bộ nhớ lệnh đã chứa chương trình này, thì offset của nó sẽ được tái sử dụng để tiết kiệm bộ nhớ lệnh.

  • freq là tần số tính bằng Hz để chạy state machine. Mặc định là tần số xung nhịp hệ thống.

    Bộ chia xung nhịp được tính bằng system clock frequency / freq, do đó có thể có một số lỗi làm tròn nhỏ.

    Bộ chia xung nhịp tối thiểu có thể là một phần 65536 của xung nhịp hệ thống: vì vậy ở tần số xung nhịp hệ thống mặc định 125MHz, giá trị tối thiểu của freq1908. Để chạy state machine ở tần số chậm hơn, bạn cần giảm tốc độ xung nhịp hệ thống bằng machine.freq().

  • in_base là chân (pin) đầu tiên để sử dụng cho các lệnh in().

  • out_base là chân (pin) đầu tiên để sử dụng cho các lệnh out().

  • set_base là chân (pin) đầu tiên để sử dụng cho các lệnh set().

  • jmp_pin là chân (pin) đầu tiên để sử dụng cho các lệnh jmp(pin, ...).

  • sideset_base là chân (pin) đầu tiên để sử dụng cho side-setting.

  • in_shiftdir là hướng ISR sẽ dịch chuyển, có thể là PIO.SHIFT_LEFT hoặc PIO.SHIFT_RIGHT.

  • out_shiftdir là hướng OSR sẽ dịch chuyển, có thể là PIO.SHIFT_LEFT hoặc PIO.SHIFT_RIGHT.

  • push_thresh là ngưỡng tính bằng bit trước khi auto-push hoặc re-pushing có điều kiện được kích hoạt.

  • pull_thresh là ngưỡng tính bằng bit trước khi auto-pull hoặc re-pulling có điều kiện được kích hoạt.

Lưu ý: các chân (pin) được sử dụng cho in_base cần được cấu hình thủ công cho đầu vào (hoặc cách khác) để PIO có thể thấy tín hiệu mong muốn (chúng có thể là chân đầu vào, chân đầu ra, hoặc kết nối với ngoại vi khác). jmp_pin cũng có thể được cấu hình thủ công, nhưng mặc định sẽ là chân đầu vào.

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

Lấy hoặc đặt trạng thái state machine hiện đang chạy hay không.

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

Khởi động lại state machine và nhảy về đầu chương trình.

Phương thức này xóa trạng thái nội bộ của state machine bằng thanh ghi SM_RESTART của RP2040. Bao gồm:

  • bộ đếm dịch chuyển đầu vào và đầu ra

  • nội dung của thanh ghi dịch chuyển đầu vào

  • bộ đếm trễ

  • trạng thái đang chờ IRQ

  • một lệnh bị treo đang chạy bằng StateMachine.exec()

exec(instr: str | int) None

Thực thi một lệnh PIO đơn lẻ.

Nếu instr là một chuỗi thì sử dụng asm_pio_encode để mã hóa lệnh từ chuỗi đã cho.

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

Nếu instr là một số nguyên thì nó được xử lý như một lệnh mã máy PIO đã được mã hóa để thực thi.

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

Kéo một từ từ FIFO RX của state machine.

Nếu FIFO trống, nó sẽ chặn cho đến khi dữ liệu đến (tức là state machine đẩy một từ).

Giá trị được dịch chuyển phải shift bit trước khi trả về, tức là giá trị trả về là word >> shift.

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

Đẩy các từ lên FIFO TX của state machine.

value có thể là một số nguyên, một mảng kiểu B, H hoặc I, hoặc một bytearray.

Phương thức này sẽ chặn cho đến khi tất cả các từ đã được ghi vào FIFO. Nếu FIFO đầy hoặc trở nên đầy, phương thức sẽ chặn cho đến khi state machine kéo đủ các từ để hoàn tất việc ghi.

Mỗi từ trước tiên được dịch chuyển trái shift bit, tức là state machine nhận word << shift.

rx_fifo() int

Trả về số từ trong FIFO RX của state machine. Giá trị 0 cho biết FIFO trống.

Hữu ích để kiểm tra xem có dữ liệu đang chờ đọc hay không, trước khi gọi StateMachine.get().

tx_fifo() int

Trả về số từ trong FIFO TX của state machine. Giá trị 0 cho biết FIFO trống.

Hữu ích để kiểm tra xem có không gian để đẩy thêm một từ bằng StateMachine.put() hay không.

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

Trả về đối tượng IRQ cho StateMachine đã cho.

Tùy chọn cấu hình nó.

Buffer protocol

Lớp StateMachine hỗ trợ buffer protocol, cho phép truy cập trực tiếp vào các FIFO truyền và nhận cho mỗi state machine. Điều này chủ yếu nhằm mục đích cho phép các đối tượng StateMachine được truyền trực tiếp làm tham số đọc hoặc ghi khi cấu hình kênh rp2.DMA().