Programmable I/O (PIO) ของ Raspberry Pi RP2040 มันน่าสนใจอย่างไร

ความนิยมของบอร์ด Raspberry Pico ที่ขับเคลื่อนด้วย ไมโครคอนโทรลเลอร์ RP2040 ทำให้ผู้อ่านทุกคนต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับบอร์ดและชิป ดังนั้นวันนี้เราจะมาพูดถึง วงจรภายใน Programmable I/O ของ RP2040 ซึ่งเป็นคุณสมบัติที่ทำให้แตกต่างจากบอร์ดไมโครคอนโทรลเลอร์อื่น ๆ ส่วนใหญ่

PIO จำนวน 2 บล็อก (PIO0 & PIO1) หรือจะเรียกว่าอินเทอร์เฟซฮาร์ดแวร์ใน RP2040 มีวงจร Programmable State Machines อย่างละ 4 ชุด บล็อกPIO ทั้งสองนี้สามารถรันโปรแกรมพร้อมกันเพื่อจัดการ GPIO และถ่ายโอนข้อมูลดิบ ตอนนี้ State machine เหล่านี้ทำอะไร?  PIO State machine ดำเนินการโปรแกรมที่ดึงมาจากแหล่งต่างๆ บางครั้งโปรแกรมจะถูกนำมาจากไลบรารี PIO (UART, SPI หรือ I2C) หรือซอฟต์แวร์สำหรับผู้ใช้ Pico-PIO-State-Machine-768x686

ทำไม Programmable I/O?

บอร์ดทั้งหมดมักจะมาพร้อมกับการสนับสนุนฮาร์ดแวร์สำหรับโปรโตคอลการสื่อสารดิจิทัลเช่น I2C, SPI และ UART อย่างไรก็ตามหากคุณวางแผนที่จะใช้อินเทอร์เฟซเหล่านี้มากกว่าที่มีอยู่บนบอร์ด คุณสามารถใช้ Programmable I/O ได้ที่มีให้ในไมโครคอนโทรลเลอร์ RP2040

มีสิ่งที่ดีกว่าที่คิด สมมติว่าคุณต้องการเอาต์พุตวิดีโอ DPI หรือ “สื่อสารกับอุปกรณ์อนุกรมที่พบใน AliExpress” ก็สามารถทำได้ด้วย Programmable I/O ได้ ตามชื่อที่ระบุไว้ Programmable I/O ทำให้ชัดเจนว่าสามารถตั้งโปรแกรมได้โดยตรงเพื่อรองรับอินเทอร์เฟซต่างๆรวมถึงอินเทอร์เฟซการ์ด SD, เอาต์พุต VGA และการถ่ายโอนข้อมูลความเร็วสูง รอก่อน! เรามีส่วนที่น่าตื่นเต้นที่สุดของบทความที่กำลังจะมาถึงนั่นคือ Programmable I/O เพื่อให้งานของคุณง่ายขึ้น

เราจะเริ่มต้นกับการเขียนโปรแกรม Programmable I/O ของ RP2040 ได้อย่างไร

Pico SDK (Software Development Kit) ให้ส่วนหัวไลบรารีและระบบสร้างที่จำเป็นในการเขียนโปรแกรมสำหรับอุปกรณ์ที่ใช้ RP2040 เช่น Raspberry Pi Pico ในภาษา C, C++ หรือ Arm assembly

หากคุณวางแผนที่จะใช้ Python ในการเขียนโค้ดคุณต้องใช้ตัวแก้ไขที่เหมาะสมเท่านั้น (สมมติว่า Thonny) และ MicroPython ที่ติดตั้งบนบอร์ดพัฒนา แต่ในกรณีของ ภาษา C/C++ คุณต้องใช้ไฟล์ CMake ที่บอก Pico SDK ว่าจะเปลี่ยนไฟล์ C ให้เป็นแอปพลิเคชั่นไบนารีสำหรับบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ RP2040 ตามที่อธิบายไว้ในบทเรียนแนะนำ MicroPython และ ภาษา C สำหรับ Raspberry Pi Pico ล่าสุด

PIO Assembler จะแยกวิเคราะห์ไฟล์ต้นฉบับ PIO และเอาต์พุตเวอร์ชันที่ประกอบพร้อมสำหรับการรวมในแอปพลิเคชัน RP2040 ซึ่งรวมถึงแอปพลิเคชัน C และ C++ ที่สร้างขึ้นจาก Pico SDK และโปรแกรม Python ที่ทำงานบนพอร์ต RP2040 MicroPython

ในการเริ่มต้นด้วยการเขียนโปรแกรม State machine สำหรับแอปพลิเคชัน PIO ของคุณมีส่วนประกอบ 3 อย่าง สำหรับโปรแกรมที่ใช้ภาษา C/C++

    • A PIO โปรแกรม
    • C-language ซอฟต์แวร์ที่ใช้ภาษา C รันเพื่อแสดง
    • A CMake ไฟล์ที่อธิบายถึงวิธีการรวมทั้งสองนี้เป็นอิมเมจโปรแกรมเพื่อโหลดลงในบอร์ดพัฒนาที่ใช้ RP2040

คำสั่งในการเขียนโปรแกรมสำหรับ PIO

ตอนนี้เมื่อพูดถึงการเขียนโปรแกรมอินเทอร์เฟซ I/O จะใช้ภาษาAssembly มีเและพียง 9 คำสั่ง “JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ และ SET”  แม้ว่าคนส่วนใหญ่อาจสนใจในการเขียนโปรแกรมอินเทอร์เฟซ PIO ด้วยภาษา C / C++ หรือ Python แต่ให้เราดูคำสั่งภาษาAssembly บางส่วนที่ใช้สำหรับอินเทอร์เฟซ I/O

    • JMP: คำสั่ง “jump” นี้อาจเป็นคำสั่งที่มีเงื่อนไขหรือไม่ใช่เงื่อนไขก็ได้ ในการนี้จะถ่ายโอนขั้นตอนการดำเนินการโดยการเปลี่ยนการลงทะเบียนตัวชี้คำสั่ง กล่าวง่ายๆคือด้วยคำสั่ง “jmp” ขั้นตอนการดำเนินการจะไปยังส่วนอื่นของโค้ด
    • WAIT: คำสั่งนี้จะหยุดการทำงานของโค้ด แต่ละคำสั่งใช้เวลาหนึ่งรอบเว้นแต่จะหยุดทำงาน (โดยใช้คำสั่ง WAIT)
    • OUT: คำสั่งนี้จะเปลี่ยนข้อมูลจากการลงทะเบียนกับเอาต์พุตไปยังปลายทางอื่น ๆ ครั้งละ 1 … 32 บิต
    • PULL: คำสั่งนี้จะแสดงคำ 32 บิตจาก TX FIFO ลงในรีจิสเตอร์กะเอาต์พุต
    • IN: คำสั่งนี้จะเปลี่ยน 1 …ครั้งละ 32 บิตในรีจิสเตอร์
    • PUSH: คำสั่งนี้เพื่อเขียนเนื้อหา ISR ไปยัง RX FIFO

Pico-PIO-Assembly-Language-768x354

ข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งภาษาแอสเซมบลีมีอยู่ใน แผ่นข้อมูลRP2040 

ตัวอย่างการใช้ภาษา C/C++ และ MicroPython ในการเขียนโปรแกรม Programmable I/O ของ RP2040

ทำให้ง่ายขึ้นเราจะตรวจสอบโปรแกรมของ hello_world ที่กะพริบ LED ออนบอร์ดโดย Programmable I/O และนำข้อมูลข้อมูล ขนาด 32 บิตไปใส่หรืออ่านข้อมูลจาก FIFO (คำสั่ง PULL)

โปรแกรมใน C/C ++ มีลักษณะดังนี้:


รหัส C/C++ ด้านบนจะกะพริบ LED หนึ่งรอบครบ 1 วินาที LED ถูกตั้งโปรแกรมในลักษณะที่จะเปิดเป็นเวลา 500 มิลลิวินาทีตามด้วยปิดเป็นเวลา 500 มิลลิวินาที แต่ก่อนstate machine จะรันโปรแกรมได้เราจำเป็นต้องโหลดโปรแกรมลงในหน่วยความจำคำสั่งนี้ “ ฟังก์ชัน pio_add_program () ค้นหาพื้นที่ว่างสำหรับโปรแกรมของเราในหน่วยความจำคำสั่งของ PIO ที่กำหนดและโหลดขึ้นมา” ด้วยเหตุนี้เราจึงกำหนดค่าstate machine ให้ส่งออกข้อมูลไปยัง LED ออนบอร์ด

รหัสแอสเซมบลีสำหรับไฟล์. pio ที่แสดงด้านล่างมีฟังก์ชันตัวช่วย C ทั้งหมดเพื่อตั้งรหัส C/C++


นอกเหนือจากนี้คุณยังต้องการไฟล์ CMake ที่อธิบายถึงวิธีการสร้างไฟล์ .pio และ .c ในไบนารีที่เหมาะสำหรับการโหลดลงในบอร์ดพัฒนา Raspberry Pi Pico ของคุณ

ไม่มีตัวอย่างเทียบเท่าที่เขียนด้วย MicroPython แต่เราสามารถเห็นรหัส PIO MicroPython ที่ง่ายกว่าที่ใช้ในการกะพริบ LED ออนบอร์ด


ในกรณีนี้ไม่มีไฟล์ .pio แยกต่างหากและทั้ง MicroPython และรหัสแอสเซมบลีจะถูกวางไว้ในไฟล์ .py

แม้ว่า PIO จะสามารถตั้งโปรแกรมด้วย MicroPython ได้ แต่เอกสาร Python SDKระบุว่าขณะนี้ไม่เสถียร/กำลังดำเนินการอยู่ ดังนั้นจึงแนะนำให้ใช้ภาษา C/C++

สามารถแก้ไขโค้ดได้หลายแบบโดยการเพิ่มสีที่คุณต้องการแสดงด้วยความช่วยเหลือของรูปแบบฐานสิบหกใน RGB อย่างไรก็ตามมีตัวอย่างมากมาย เช่น PWM, UART หรือแม้แต่การเชื่อมต่อ NeoPixels สำหรับผู้ที่สนใจคุณสามารถค้นหาตัวอย่างการเขียนโปรแกรม PIO มากมายในที่เก็บ GitHub สำหรับตัวอย่าง ภาษา C และ MicroPython

สรุป

Programmable I/O ของ RP2040 มีความสามารถในการรันโปรแกรมพร้อมกัน เพื่อรองรับอินเทอร์เฟซต์ เช่น เอาต์พุต VGA และการถ่ายโอนข้อมูลความเร็วสูงขึ้น คุณสามารถตรวจสอบในเอกสาร Rraspberry pi pico C/C++SDK  สำหรับ C/C++ และ Python เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ RP2040 Programmable I/O

แปลจากบทความภาษาอังกฤษ A closer look at Raspberry Pi RP2040 Programmable IOs (PIO)

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments