الصنف StateMachine -- الوصول إلى واجهة الإدخال/الإخراج القابل للبرمجة في RP2040

يتيح الصنف StateMachine الوصول إلى واجهة PIO (الإدخال/الإخراج القابل للبرمجة) في RP2040.

لتجميع برامج PIO، راجع rp2.asm_pio().

البانيات (Constructors)

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

الحصول على آلة الحالة المرقّمة id. يحتوي RP2040 على نسختي PIO متطابقتين، كل منهما بأربع آلات حالة: فيكون المجموع 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 هو التردد بالهرتز الذي تُشغَّل به آلة الحالة. القيمة الافتراضية هي تردد ساعة النظام.

    يُحسب مقسّم الساعة على أنه system clock frequency / freq، لذا قد تحدث أخطاء تقريب طفيفة.

    أصغر مقسّم ساعة ممكن هو جزء من 65536 من ساعة النظام: فعند تردد ساعة النظام الافتراضي البالغ 125MHz، تكون القيمة الدنيا لـ freq هي 1908. لتشغيل آلات الحالة بترددات أبطأ، ستحتاج إلى خفض سرعة ساعة النظام باستخدام machine.freq().

  • in_base هو أول دبوس يُستخدم لتعليمات in().

  • out_base هو أول دبوس يُستخدم لتعليمات out().

  • set_base هو أول دبوس يُستخدم لتعليمات set().

  • jmp_pin هو أول دبوس يُستخدم لتعليمات jmp(pin, ...).

  • sideset_base هو أول دبوس يُستخدم للضبط الجانبي (side-setting).

  • 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

إعادة تشغيل آلة الحالة والقفز إلى بداية البرنامج.

تمسح هذه الطريقة الحالة الداخلية لآلة الحالة باستخدام سجل SM_RESTART الخاص بـ RP2040. ويشمل ذلك:

  • عدّادات إزاحة الإدخال والإخراج

  • محتويات سجل إزاحة الإدخال

  • عدّاد التأخير

  • حالة الانتظار على 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 لآلة الحالة.

إذا كان الطابور فارغاً، فإنه يحجب حتى تصل البيانات (أي حتى تدفع آلة الحالة كلمة).

تُزاح القيمة إلى اليمين بمقدار shift بتاً قبل الإرجاع، أي أن القيمة المُرجعة هي word >> shift.

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

دفع كلمات إلى طابور TX FIFO لآلة الحالة.

يمكن أن يكون value عدداً صحيحاً، أو مصفوفة من النوع B أو H أو I، أو bytearray.

ستحجب هذه الطريقة حتى تُكتب جميع الكلمات إلى الطابور. إذا كان الطابور ممتلئاً أو أصبح ممتلئاً، ستحجب الطريقة حتى تسحب آلة الحالة كلمات كافية لإكمال الكتابة.

تُزاح كل كلمة أولاً إلى اليسار بمقدار shift بتاً، أي أن آلة الحالة تستقبل word << shift.

rx_fifo() int

إرجاع عدد الكلمات في طابور RX FIFO لآلة الحالة. القيمة 0 تشير إلى أن الطابور فارغ.

مفيد للتحقق مما إذا كانت هناك بيانات بانتظار القراءة، قبل استدعاء StateMachine.get().

tx_fifo() int

إرجاع عدد الكلمات في طابور TX FIFO لآلة الحالة. القيمة 0 تشير إلى أن الطابور فارغ.

مفيد للتحقق مما إذا كانت هناك مساحة لدفع كلمة أخرى باستخدام StateMachine.put().

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

إرجاع كائن IRQ لآلة الحالة المعطاة.

اختيارياً، إعداده.

بروتوكول المخزن المؤقت (buffer protocol)

يدعم الصنف StateMachine الـ buffer protocol، مما يتيح الوصول المباشر إلى طوابير FIFO للإرسال والاستقبال لكل آلة حالة. والغرض الأساسي من ذلك هو السماح بتمرير كائنات StateMachine مباشرة كمعاملات قراءة أو كتابة عند إعداد قناة rp2.DMA().