TinyGo 0.42 เพิ่มการรองรับไมโครคอนโทรลเลอร์ Puya PY32 จำนวน 87 รุ่น และบอร์ดพัฒนา EmbedFire อีก 2 รุ่น

CNXSoft: บทความ Guest Post นี้เขียนโดย Pavel Burgr ซึ่งเป็นผู้เพิ่มการรองรับ MCU Puya PY32 ให้กับ TinyGo 0.42 ซึ่งเป็นเวอร์ชันล่าสุดของคอมไพเลอร์ภาษา Go สำหรับไมโครคอนโทรลเลอร์ โดยเราเคยนำเสนอ TinyGo ครั้งแรกในปี 2019 และโครงการนี้ยังคงได้รับการพัฒนาอย่างต่อเนื่อง ปัจจุบันมีดาวบน GitHub 17.7K ดวง, Fork 1.1K ครั้ง และมีผู้ร่วมพัฒนา 243 คน บทความนี้เราได้ปรับแก้เนื้อหาเล็กน้อย พร้อมเพิ่มภาพประกอบและลิงก์บางส่วน

TinyGo 0.42 เพิ่มการรองรับตระกูลไมโครคอนโทรลเลอร์ Arm แบบ 32-bit อย่าง Puya PY32 โดยพอร์ตใหม่นี้ประกอบด้วยโค้ดสำหรับการเริ่มต้นระบบ, คำจำกัดความรีจิสเตอร์ของอุปกรณ์ที่สร้างขึ้นอัตโนมัติ, linker scripts, รองรับ GPIO และ UART รวมถึง target สำหรับการกำหนดค่า MCU รายตัวจำนวน 87 แบบ นอกจากนี้ยังมีคำจำกัดความของบอร์ดสำหรับบอร์ดพัฒนา EmbedFire ราคาประหยัด 2 รุ่นที่มีจำหน่ายผ่าน AliExpress

พอร์ตนี้พัฒนาโดย Pavel Burgr และถูกรวมเข้ากับโครงการ ผ่าน pull request #5106 แรงจูงใจส่วนหนึ่งคือการสร้างแพลตฟอร์มเฟิร์มแวร์ที่มีความเสถียรและใช้งานง่ายสำหรับอุปกรณ์ IoT ขนาดเล็กที่ทำงานร่วมกับบริการ Registry และโปรโตคอลวิทยุพลังงานต่ำ BleRiot โดยโครงการเหล่านี้แยกออกจาก TinyGo แต่แสดงให้เห็นถึงลักษณะของงานที่มีข้อจำกัดด้านทรัพยากร ซึ่ง target ใหม่เหล่านี้ถูกออกแบบมาเพื่อรองรับ

MCU ตระกูล Puya PY32 ที่ TinyGo 0.42 รองรับ

การรองรับ PY32 อย่างครอบคลุม

TinyGo เป็นคอมไพเลอร์ภาษา Go สำหรับไมโครคอนโทรลเลอร์, WebAssembly และระบบอื่น ๆ ที่มีข้อจำกัดด้านทรัพยากร โดยใช้ LLVM ในการสร้างไบนารี native ที่มีขนาดกะทัดรัด และมี Hardware Abstraction Layer ผ่านแพ็กเกจอย่าง machine ขณะเดียวกันยังคงใช้ไวยากรณ์และเครื่องมือที่คุ้นเคยของภาษา Go การนำ Go ไปรันบนชิปที่มี SRAM เพียง 2 KB อาจฟังดูเหมือนเป็นเรื่องท้าทายอย่างมาก แต่จริง ๆ แล้วนี่คือประเภทของงานที่ TinyGo ถูกสร้างขึ้นมาเพื่อรองรับ

พอร์ต PY32 รองรับทั้งอุปกรณ์ที่ใช้แกน Cortex-M0+ และ Cortex-M4 โดยตาราง target ครอบคลุมการกำหนดค่าหน่วยความจำที่ใช้งานจริงจำนวน 87 แบบ จากตระกูล device definition จำนวน 40 ตระกูล ตั้งแต่ชิปที่มี Flash 8 KB และ SRAM 2 KB ไปจนถึงอุปกรณ์ที่มี Flash 512 KB และ SRAM 144 KB

ซีรีส์ที่รองรับได้แก่:

  • PY32E407
  • PY32F001, F002, F003, F021, F030, F031, F032, F040, F071, F072, F403 และ F410
  • PY32L020 และ L090
  • PY32M010, M020, M030, M031 และ M070
  • PY32MD310, MD320, MD410, MD420 และ MD430
  • PY32T020, T090 และ T092

ของชิปแต่ละรุ่นจะเลือก memory map ที่ถูกต้องสำหรับ Flash และ SRAM โดยอัตโนมัติ ส่วนคำจำกัดความของอุปกรณ์ต่อพ่วงถูกสร้างขึ้นจากข้อมูล CMSIS ของ Puya ผ่าน py32-svd repository ทำให้นักพัฒนาไดรเวอร์สามารถใช้ชื่อรีจิสเตอร์แบบมีชนิดข้อมูลผ่าน device/py32 แทนที่จะต้องใช้ตาราง address ที่กำหนดขึ้นเอง

machine API ใน TinyGo 0.42 รองรับการเริ่มต้น clock และ timer, GPIO และ UART รวมถึง UART ตัวที่สองในชิปบางรุ่น ขณะที่ ADC, I2C, SPI และ PWM ยังไม่มีไดรเวอร์ machine ที่เป็นมาตรฐานและใช้ได้แบบ portable แต่รีจิสเตอร์ที่สร้างขึ้นอัตโนมัติยังสามารถเข้าถึงได้จากโค้ดระดับ low-level

รองรับบอร์ด EmbedFire 2 รุ่น

บอร์ดพัฒนา Puya PY32 ราคาประหยัดจาก EmbedFire

บอร์ดพัฒนา Puya32 ขนาดเล็ก 2 รุ่นมี target และ pin alias เฉพาะ ทำให้เป็นวิธีที่ง่ายที่สุดในการทดลองใช้พอร์ตนี้ โดยทั้งสองรุ่นมีราคา ต่ำกว่า $2 (~66฿) บน AliExpress ส่วนบอร์ด PY32F030 วางจำหน่าย ที่ราคา $7 (~230฿) ขึ้นไปบน Amazon

บอร์ด EmbedFire PY32F030 EmbedFire PY32F002B
MCU PY32F030K28U6TR PY32F002BF15U6TR
Core และหน่วยความจำ Cortex-M0+, แฟลช 64 KB, SRAM 8 KB Cortex-M0+ สูงสุด 24 MHz, แฟลช 24 KB, SRAM 3 KB
Alias บนบอร์ด LED 3 ดวง, ปุ่ม 2 ปุ่ม, UART เริ่มต้น LED 3 ดวง, ปุ่ม 2 ปุ่ม, UART เริ่มต้น
TinyGo target embedfire-py32f030 embedfire-py32f002b

บอร์ด PY32F030 จับคู่ LED1, LED2 และ LED3 เข้ากับพิน PA2, PA3 และ PA4 ส่วนปุ่มสองปุ่มจับคู่กับ PA5 และ PA6 โดย UART เริ่มต้นใช้ PA7 เป็น TX และ PA8 เป็น RX ส่วนบอร์ด PY32F002B ที่เล็กกว่าจับคู่ LED เข้ากับ PA1, PA5 และ PA4 ปุ่มเข้ากับ PA3 และ PA0 และ UART เริ่มต้นกับ PA6 และ PA7

บอร์ดทั้งสองรุ่นกำหนด machine.LED ให้เป็น alias สำหรับ LED ตัวที่สองบนบอร์ด ดังนั้นโปรแกรมแรกแบบเดียวกันสามารถใช้เพื่อทดสอบการกระพริบ LED บน target ทั้งสองรุ่นได้:


เมื่อเชื่อมต่อ SWD probe ที่รองรับและตั้งค่า pyOCD ให้ตรงกับอุปกรณ์ Puya ที่เลือกแล้ว สามารถ build และ flash โปรแกรมด้วยคำสั่งเดียว โดยไม่จำเป็นต้องเสียเวลาค้นหาและทำความเข้าใจ Makefile ที่ซับซ้อน:


สำหรับบอร์ดที่เล็กกว่า เพียงเปลี่ยน target:


target ของบอร์ดจะใช้ memory map ที่ถูกต้องของ py32f030x8 และ py32f002bx5 รวมถึงเรียกใช้ pyOCD target ที่ตรงกับอุปกรณ์ระหว่างการ flash นอกจากนี้ยังมี bare-chip target สำหรับบอร์ดที่ออกแบบขึ้นเอง และมี TinyGo PY32 project template ซึ่งมีตัวอย่างโปรแกรม blink เพิ่มเติม รวมถึง Makefile สำหรับใช้เป็นจุดเริ่มต้นของโครงการ

เทมเพลตโปรเจกต์ TinyGo สำหรับ PY32

จาก MCU ราคาประหยัดสู่  IoT Nodeที่เชื่อมต่อกับ Registry

หลังจากผ่านการทดลอง blink LED แบบพื้นฐานแล้ว แรงจูงใจที่แท้จริงของการพอร์ตนี้มีความน่าสนใจมากกว่าเดิม, Pavel พัฒนาการรองรับ PY32 ขณะสร้าง BleRiot โปรโตคอลแบบร้องขอ/ตอบกลับที่เรียบง่ายและเชื่อถือได้สำหรับโหนดวิทยุกำลังต่ำ

แต่ละโหนดจะเปิดเผยรีจิสเตอร์แบบ signed 32-bit และรองรับการทำงานเพียง 2 แบบ ได้แก่ GET และ SET นี่คือชุดคำสั่งทั้งหมด ซึ่งถือเป็นข้อดีมากกว่าข้อจำกัด, Linux hub จะทำหน้าที่อ่านค่าจากรีจิสเตอร์ รวมถึงจัดการชื่อและการแปลงหน่วย ตลอดจนการ retry และ timeout การมีอินเทอร์เฟซที่เล็กและคาดเดาได้ช่วยให้เฟิร์มแวร์มีขนาดกะทัดรัด ขณะที่การกู้คืนเมื่อแพ็กเก็ตสูญหายจะถูกจัดการเพียงครั้งเดียวที่ hub แทนที่จะต้องให้แต่ละแอปพลิเคชันจัดการเอง

หนึ่ง hub สามารถสื่อสารกับหลายโหนดผ่านลิงก์วิทยุ GFSK แบบกำหนดเองที่ความเร็ว 250 kbps พร้อมการจัดเฟรมแพ็กเก็ตที่เข้ากันได้กับ BLE อย่างไรก็ตาม ระบบนี้ ไม่ใช่ Bluetooth LE หรือ GATT โหนดอ้างอิงใช้ PY32F030x8 ทำงานร่วมกับวิทยุ PAN211x 2.4 GHz ขณะที่ hub ใช้ USB radio dongle แบบเรียบง่าย

BleRiot เผยแพร่ค่าของโหนดไปยัง Registry ซึ่งเป็นบริการภายในเครื่องที่มีน้ำหนักเบา โดยแต่ละรีจิสเตอร์จะมีชื่อ, ค่าปัจจุบัน, metadata ที่เป็นตัวเลือก และค่า time-to-live (TTL) ค่าที่เก่าหรือหมดอายุจะถูกลบโดยอัตโนมัติ แอปพลิเคชันสามารถใช้ HTTP/JSON API ได้โดยตรง ส่วน Node-RED nodes ที่ให้มาสามารถทำงานร่วมกับ MQTT nodes มาตรฐานเพื่อเชื่อมต่อระบบต่าง ๆ ได้ นอกจากนี้ยังมี Prometheus endpoint ในตัว ซึ่งสามารถเผยแพร่รีจิสเตอร์ตัวเลขในรูปแบบ gauge เพื่อให้พร้อมใช้งานกับ Grafana dashboard

กล่าวอีกอย่างคือ การนำค่าอุณหภูมิขึ้นแสดงบน dashboard ไม่จำเป็นต้องสอนให้ MCU ที่มี SRAM เพียง 3 KB รู้จัก Grafana เมื่อ controller ต้องการเปลี่ยนค่า ระบบจะทำงานย้อนกลับไปในลักษณะเดียวกัน โดยส่งคำขอเปลี่ยนแปลงค่าไปยังโหนด BleRiot ใช้ device types และ register definitions ร่วมกันระหว่างเฟิร์มแวร์ TinyGo และ Linux hub นอกจากนี้เครื่องมือของระบบยังสามารถสร้าง node identity, build เฟิร์มแวร์ด้วย TinyGo และ flash ลง MCU ผ่าน SWD ได้

Registry และ BleRiot ไม่ได้เป็นสิ่งจำเป็นสำหรับการใช้ TinyGo กับ PY32 และการรองรับ PY32 ก็ไม่ได้ผูกติดกับวิทยุรุ่นใดรุ่นหนึ่งโดยเฉพาะ อย่างไรก็ตามทั้งสองโครงการเป็นตัวอย่างที่ดีว่าทำไมไมโครคอนโทรลเลอร์ราคาประหยัดจึงได้รับประโยชน์จากคอมไพเลอร์ที่มีการดูแลอย่างต่อเนื่อง, chip target ที่สามารถสร้างซ้ำได้อย่างน่าเชื่อถือ และ Hardware API มาตรฐานที่ใช้งานผ่านภาษา Go

การวางจำหน่ายและขั้นตอนถัดไป

การรองรับ PY32 มีให้ใช้งานแล้วใน TinyGo 0.42.0 โดย target EmbedFire ทั้ง 2 รุ่นเป็นจุดเริ่มต้นที่ง่ายที่สุดสำหรับการทดลองใช้งาน ขณะที่รายชื่อชิปที่รองรับจำนวนมากช่วยให้นักพัฒนามีพื้นฐานสำหรับสร้างบอร์ดแบบกำหนดเอง ตั้งแต่ sensor node ขนาดเล็ก ไปจนถึง controller ที่ใช้ Cortex-M4 ซึ่งมีความสามารถสูงขึ้น

TinyGo 0.42 ให้ความสำคัญกับความเสถียรของ runtime, memory map ที่ถูกต้อง, GPIO และการสื่อสารแบบ serial มากกว่าการอ้างว่ารองรับอุปกรณ์ต่อพ่วงทั้งหมดอย่างสมบูรณ์ ในอนาคตนักพัฒนาสามารถเพิ่มการรองรับ ADC, I2C, SPI, PWM และ board definitions แบบ portable ได้บนพื้นฐานของ register layer ที่สร้างขึ้นใน device/py32 สำหรับนักพัฒนาที่ใช้งาน Go อยู่แล้วในฝั่ง host ของระบบ IoT พอร์ตใหม่นี้ทำให้ MCU ตระกูล Puya ที่มีราคาประหยัดเข้าถึงได้ง่ายขึ้นอย่างมาก

หมายเหตุ CNXSoft: การรองรับ TinyGo สำหรับ MCU AT32 ดูเหมือนว่าจะเป็นลำดับถัดไป

แปลจากบทความ : TinyGo 0.42 adds support for 87 Puya PY32 MCU variants and two EmbedFire boards

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
โฆษณา