class PIO -- sử dụng PIO nâng cao

Lớp PIO bọc một trong hai khối Programmable I/O (PIO) của RP2040. Mỗi khối PIO chứa một bộ nhớ lệnh (32 lệnh) được chia sẻ bởi bốn state machine độc lập, cộng với giao diện FIFO riêng cho mỗi state machine và một bộ điều khiển IRQ.

Hầu hết các tập lệnh tương tác với PIO thông qua StateMachine -- lớp này dành cho các trường hợp sử dụng nâng cao cần:

  • Tải và gỡ bỏ chương trình tường minh qua add_program() / remove_program().

  • Di chuyển cơ sở GPIO của PIO trên cửa sổ 32 chân (pin) của chip qua gpio_base().

  • Kết nối vào các cờ IRQ ở cấp khối qua irq().

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

Constructors

class rp2.PIO(id: int)

Trả về đối tượng PIO singleton cho khối PIO được xác định bởi id. RP2040 có hai khối PIO, được đánh số 01. Ném ra ValueError cho bất kỳ id nào khác.

Methods

gpio_base(base: machine.Pin | int | None = None, /) int

Lấy hoặc đặt cơ sở GPIO cho khối PIO này.

RP2040 PIO nhìn thấy một cửa sổ 32 chân (pin) vào không gian GPIO; cửa sổ có thể bắt đầu từ GPIO0 hoặc GPIO16. Cơ sở kiểm soát cửa sổ nào có hiệu lực cho tất cả các state machine trên PIO này.

Khi không có đối số, trả về cơ sở hiện tại (số chân (pin) GPIO, 0 hoặc 16).

Khi có đối số, đặt cơ sở. base có thể là một thực thể machine.Pin hoặc số chân (pin) nguyên, và phải xác định là GPIO0 hoặc GPIO16. Cơ sở phải được đặt trước khi bất kỳ chương trình nào được thêm vào hoặc state machine được khởi tạo trên khối PIO này.

add_program(program: Callable) None

Tải program vào bộ nhớ lệnh của PIO này. Bố cục bộ nhớ kết quả được tái sử dụng cho tất cả các state machine trên khối PIO này.

Mỗi PIO chỉ có 32 lệnh bộ nhớ chương trình được chia sẻ cho tất cả các chương trình; nếu chương trình mới không vừa, phương thức này ném ra OSError(ENOMEM). Cùng một chương trình có thể được tải lên cả hai thực thể PIO, nhưng chúng chiếm các vùng bộ nhớ riêng biệt.

remove_program(program: Callable | None = None, /) None

Gỡ bỏ program khỏi bộ nhớ lệnh của PIO này, giải phóng không gian cho các chương trình mới. Nếu program bị bỏ qua, mọi chương trình hiện đang tải trên PIO này sẽ bị xóa.

Gỡ bỏ một chương trình chưa được tải là thao tác không làm gì (không có ngoại lệ).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Trả về một trong bốn thực thể StateMachine thuộc sở hữu của khối PIO này. id là chỉ số state machine cục bộ (0 -- 3).

Nếu program được cung cấp, state machine sẽ được cấu hình để chạy nó -- tất cả các đối số vị trí/từ khóa được chuyển tiếp đến StateMachine.init().

Ví dụ:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

ID state machine toàn cục của đối tượng được trả về là pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Lấy hoặc cấu hình IRQ ở cấp khối cho PIO này.

handler là hàm gọi lại kích hoạt khi bất kỳ IRQ nào của state machine được yêu cầu chốt lại. Handler nhận thực thể PIO này làm đối số duy nhất; trong handler, các state machine đang kích hoạt có thể được xác định qua self.irq().flags() AND với các hằng số IRQ_SM*.

trigger là bitmask của một hoặc nhiều IRQ_SM0 .. IRQ_SM3. Mặc định kích hoạt trên bất kỳ state machine nào.

hard=True đăng ký handler ngắt cứng (không cấp phát heap trong hàm gọi lại).

MicroPython ràng buộc IRQ 0 trên mỗi khối PIO; IRQ 1 được dành riêng và không thể truy cập từ Python.

Constants

IN_LOW: int

Truyền vào out_init / set_init / sideset_init của asm_pio() để chân (pin) bắt đầu là đầu vào được kéo xuống thấp (tức là trạng thái ba trạng thái với bộ đệm đầu ra giữ giá trị 0).

IN_HIGH: int

Truyền vào out_init / set_init / sideset_init của asm_pio() để chân (pin) bắt đầu là đầu vào với bộ đệm đầu ra giữ giá trị 1.

OUT_LOW: int

Truyền vào out_init / set_init / sideset_init của asm_pio() để chân (pin) bắt đầu là đầu ra được điều khiển ở mức logic 0.

OUT_HIGH: int

Truyền vào out_init / set_init / sideset_init của asm_pio() để chân (pin) bắt đầu là đầu ra được điều khiển ở mức logic 1.

SHIFT_LEFT: int

Truyền vào in_shiftdir / out_shiftdir của asm_pio() hoặc StateMachine.init() để dịch chuyển các bit về phía MSB.

SHIFT_RIGHT: int

Truyền vào in_shiftdir / out_shiftdir của asm_pio() hoặc StateMachine.init() để dịch chuyển các bit về phía LSB.

JOIN_NONE: int

Truyền vào fifo_join của asm_pio() để state machine có các FIFO TX và RX riêng biệt 4 từ (mặc định).

JOIN_TX: int

Truyền vào fifo_join của asm_pio() để FIFO TX được tăng gấp đôi lên 8 từ bằng cách hấp thụ FIFO RX. State machine không còn có thể nhận dữ liệu.

JOIN_RX: int

Truyền vào fifo_join của asm_pio() để FIFO RX được tăng gấp đôi lên 8 từ bằng cách hấp thụ FIFO TX. State machine không còn có thể truyền dữ liệu.

IRQ_SM0: int

Cờ trigger của irq(): state machine 0 đã kích hoạt IRQ của nó.

IRQ_SM1: int

Cờ trigger của irq(): state machine 1 đã kích hoạt IRQ của nó.

IRQ_SM2: int

Cờ trigger của irq(): state machine 2 đã kích hoạt IRQ của nó.

IRQ_SM3: int

Cờ trigger của irq(): state machine 3 đã kích hoạt IRQ của nó.