TinyGo 0.42 พา Puya PY32 เข้าโลก Go

เขียน Go บน Microcontroller ที่บางรุ่นมี SRAM แค่ 2 KB ฟังดูเหมือนสายหาทำแบบจริงจัง แต่ TinyGo 0.42 เพิ่งเปิดทางให้ตระกูล Puya PY32 เข้ามาอยู่ในโลก TinyGo ด้วย Target ครอบคลุมถึง 87 MCU configurations

ที่น่าสนใจคือ Support รอบนี้ไม่ได้มีแค่ชื่อ MCU โผล่มาในรายการ แต่มีทั้ง Startup Code, Device Register Definitions, Linker Scripts, GPIO, UART และ Memory Map ที่เลือกให้ตรงกับแต่ละ Variant

พร้อมกันนั้น TinyGo ยังเพิ่ม Board Definition สำหรับ EmbedFire Development Board ราคาประหยัด 2 รุ่น ทำให้คนที่อยากลอง PY32 ไม่จำเป็นต้องเริ่มจาก Bare Chip ตั้งแต่วันแรก

TinyGo 0.42 เพิ่มการรองรับ Puya PY32 MCU
TinyGo 0.42 เพิ่ม Target สำหรับตระกูล Puya PY32 ครอบคลุมทั้ง Cortex-M0+ และ Cortex-M4

ก่อนอ่านต่อ มี 2 เรื่องที่ต้องแยกให้ชัด: ตัวเลข 87 หมายถึง 87 concrete MCU memory configurations ไม่ใช่ Development Board 87 รุ่น และคำว่า “รองรับ PY32” ก็ยังไม่ได้หมายความว่า ADC, I2C, SPI และ PWM มี Portable machine Driver พร้อมใช้ทั้งหมดแล้ว

Key Takeaways

  • TinyGo 0.42 เพิ่ม Support สำหรับ Puya PY32
  • มี 87 concrete MCU configurations จาก 40 device-definition families
  • รองรับทั้ง Cortex-M0+ และ Cortex-M4
  • Memory Range ตั้งแต่ 8 KB Flash / 2 KB SRAM ถึง 512 KB Flash / 144 KB SRAM
  • Register Definitions Generate จาก Puya CMSIS Data ผ่าน py32-svd
  • Portable machine API รอบนี้ครอบคลุม Clock/Timer Startup, GPIO และ UART
  • ADC, I2C, SPI และ PWM ยังไม่มี Portable machine Drivers
  • Generated Registers ยังสามารถใช้จาก Low-level Code ได้
  • มี Dedicated Board Target สำหรับ EmbedFire PY32F030 และ PY32F002B
  • ทั้งสอง Board มี 3 LEDs, 2 Keys และ Default UART
  • ทั้งสอง Target กำหนด machine.LED เป็น Alias ของ LED ตัวที่สอง
  • Flash ผ่าน Supported SWD Probe และ pyOCD
  • Bare-chip Targets มีให้ใช้สำหรับ Custom Board

TinyGo คืออะไร? ทำไม Go ถึงไปรันบน MCU ได้?

TinyGo คือ Go Compiler สำหรับ Microcontrollers, WebAssembly และระบบที่มี Resource จำกัด

มันใช้ LLVM สร้าง Native Binary ที่เหมาะกับ Hardware ขนาดเล็ก พร้อม Hardware Abstraction ผ่าน Package อย่าง:

machine

แนวคิดคือ คนที่คุ้นกับ Syntax และ Tooling ของ Go ยังสามารถใช้รูปแบบการเขียนโปรแกรม ที่คุ้นเคย บน Embedded Hardware ได้

จุดที่ทำให้ PY32 น่าสนใจ: MCU บาง Target มี SRAM เพียง 2 KB แต่ TinyGo ถูกออกแบบมา สำหรับโลกที่ Memory ไม่ได้เหลือเฟือเหมือน PC ตั้งแต่แรก

TinyGo 0.42 เพิ่มอะไรให้ Puya PY32?

Port ที่ Pavel Burgr เพิ่มเข้ามา ไม่ได้มีแค่ Target Name

Source ระบุองค์ประกอบหลัก เช่น:

  • Startup Code
  • Generated Device-register Definitions
  • Linker Scripts
  • GPIO Support
  • UART Support
  • MCU-specific Memory Maps
  • Board Definitions สำหรับ EmbedFire 2 รุ่น

Port นี้ถูก Merge ผ่าน TinyGo Pull Request #5106 และเข้าสู่ TinyGo 0.42

87 Targets ไม่ได้แปลว่ามีบอร์ดให้ซื้อ 87 รุ่น

TinyGo Target Table มี:

87 concrete memory configurations

ครอบคลุม:

40 device-definition families

เหตุผลที่ต้องแยกละเอียด เพราะ MCU ชื่อ Family เดียวกัน ยังสามารถมี Flash / SRAM คนละขนาดได้

MCU Family

Device Variant

Flash / SRAM Configuration

TinyGo Target ที่ใช้ Memory Map ถูกต้อง

Dedicated Board Targets ในข่าวนี้มี 2 รุ่น: EmbedFire PY32F030 และ EmbedFire PY32F002B ส่วน Target อื่นจำนวนมาก เป็น MCU / Bare-chip Configurations สำหรับชิปแต่ละ Variant

PY32 Series ที่ TinyGo 0.42 ครอบคลุม

Source ระบุ Series หลักดังนี้:

  • PY32E407
  • PY32F001
  • PY32F002
  • PY32F003
  • PY32F021
  • PY32F030
  • PY32F031
  • PY32F032
  • PY32F040
  • PY32F071
  • PY32F072
  • PY32F403
  • PY32F410
  • PY32L020
  • PY32L090
  • PY32M010
  • PY32M020
  • PY32M030
  • PY32M031
  • PY32M070
  • PY32MD310
  • PY32MD320
  • PY32MD410
  • PY32MD420
  • PY32MD430
  • PY32T020
  • PY32T090
  • PY32T092

Coverage มีทั้ง Cortex-M0+ และ Cortex-M4

Memory Configuration กว้างตั้งแต่:

8 KB Flash + 2 KB SRAM

ไปถึง:

512 KB Flash + 144 KB SRAM

ชื่อ MCU คล้ายกัน แต่ Memory Map ไม่เท่ากัน

Target แต่ละตัว จึงต้องเลือก Flash และ SRAM Map ให้ตรงกับ Chip Configuration จริง

Peripheral Definition ถูก Generate จาก Puya CMSIS Data ผ่าน Supporting Repository:

py32-svd

ทำให้ Driver Developer สามารถใช้ Typed Register Names จาก:

device/py32

แทนการสร้าง Private Address Table ของ Register เองทุก Project

นี่คือสิ่งที่ Target ช่วยจริง ๆ: ไม่ได้มีไว้แค่ให้คำสั่ง Compile รู้ชื่อ Board แต่ช่วยให้ Compiler / Linker รู้ว่าชิปนั้นมี Memory อยู่ตรงไหน และมีขนาดเท่าไร

machine API ฝั่ง PY32 ใช้อะไรได้แล้ว?

TinyGo 0.42 ฝั่ง PY32 มี Support ระดับ Portable API สำหรับ:

  • Clock Startup
  • Timer Startup
  • GPIO
  • UART
  • UART ตัวที่สองใน MCU บางรุ่น

นี่ทำให้ Project พื้นฐาน เช่น LED, Button และ Serial Communication เริ่มต้นผ่าน API ที่มีรูปแบบแบบ TinyGo ได้ง่ายขึ้น

แต่ Peripheral Support ยังไม่ครบ

TinyGo 0.42 ยังไม่มี Portable machine Driver สำหรับ:

  • ADC
  • I2C
  • SPI
  • PWM

อย่างไรก็ตาม Generated Register Definitions ของ Peripheral ยังมีอยู่ และสามารถเข้าถึงจาก Low-level Code ได้

รองรับ MCU ≠ Peripheral พร้อมทุกอย่าง: ถ้าจะเริ่ม Project ที่พึ่ง I2C Sensor, SPI Display, ADC หรือ PWM ควรตรวจ TinyGo / PY32 Driver เวอร์ชันล่าสุดก่อนซื้อ Hardware หรือวาง Architecture

สอง EmbedFire Board ที่ลอง TinyGo ได้ตรงที่สุด

TinyGo 0.42 มี Board Definition พร้อม Pin Alias สำหรับ Board ราคาประหยัด 2 รุ่น

รายการ EmbedFire PY32F030 EmbedFire PY32F002B
MCU PY32F030K28U6TR PY32F002BF15U6TR
Core Cortex-M0+ Cortex-M0+ สูงสุด 24 MHz
Flash 64 KB 24 KB
SRAM 8 KB 3 KB
Onboard 3 LEDs, 2 Keys, Default UART 3 LEDs, 2 Keys, Default UART
TinyGo Target embedfire-py32f030 embedfire-py32f002b

Pin Alias ทำให้เริ่มต้นง่ายขึ้นยังไง?

EmbedFire PY32F030

  • LED1 → PA2
  • LED2 → PA3
  • LED3 → PA4
  • Key 1 → PA5
  • Key 2 → PA6
  • UART TX → PA7
  • UART RX → PA8

EmbedFire PY32F002B

  • LED → PA1 / PA5 / PA4
  • Keys → PA3 / PA0
  • UART → PA6 / PA7

Board Definition ของทั้งสองรุ่น กำหนด:

machine.LED

ให้เป็น Alias ของ LED ตัวที่สอง

ผลคือ Blink Program เดียวกัน สามารถใช้กับทั้งสอง Board โดยไม่ต้อง Hard-code PA Pin ลงใน Code

Flash ไม่ใช่แค่เสียบ USB แล้วกด Upload

Source ระบุว่า การ Flash ตัวอย่าง ใช้:

  • Supported SWD Probe
  • pyOCD
  • pyOCD Configuration ที่ตรงกับ Puya Device

หลังจาก Environment พร้อมแล้ว จึงใช้คำสั่ง tinygo flash พร้อม Board Target

1

เตรียม TinyGo Project

สร้างไฟล์ Go หรือใช้ Project Template จากผู้พัฒนา

2

ต่อ SWD Probe

เชื่อม Debug / Programming Interface กับ PY32 Board ตาม Hardware ที่ใช้งาน

3

ตั้ง pyOCD ให้ตรง Device

Board Target จะอ้างอิง pyOCD Target ที่ตรงกับ Puya MCU

4

เลือก TinyGo Target

PY32F030 ใช้: embedfire-py32f030

PY32F002B ใช้: embedfire-py32f002b

อย่าข้ามเรื่อง SWD / pyOCD: ตัวอย่างใน Source ไม่ได้บอกว่า Board สามารถ Flash ผ่าน USB Serial ได้เหมือน Development Board บางตระกูล ดังนั้นควรทำตาม Debug / Programming Path ของ PY32 Target ที่ใช้งานจริง

ไม่อยากเริ่ม Project จาก Folder เปล่า? มี Template ให้

Pavel Burgr มี TinyGo PY32 Project Template สำหรับใช้เป็นจุดเริ่มต้น

Source ระบุว่ามี:

  • Blink Examples เพิ่มเติม
  • Starting Makefile
  • Project Structure สำหรับเริ่มงาน PY32

Board ราคาประหยัดจริง แต่ราคาในข่าวไม่ใช่ราคาถาวร

CNX ระบุว่า EmbedFire Board ทั้งสองรุ่น มีขายใน AliExpress ต่ำกว่า $2 ในช่วงที่บทความเผยแพร่

ส่วน PY32F030 Board มีราคาเริ่มต้นประมาณ $7 บน Amazon ตาม Link ที่ Source อ้างในเวลานั้น

ตัวเลขนี้ใช้เพื่อให้เห็นระดับราคาเท่านั้น: ราคาสินค้า, Shipping, ภาษี และค่าเงิน เปลี่ยนได้ จึงควรตรวจ Store ปัจจุบัน ก่อนเปรียบเทียบต้นทุนจริง

แล้วทำไมผู้พัฒนาถึงลงทุนทำ PY32 Port?

Motivation หนึ่ง ของ Pavel Burgr คือการสร้าง Firmware Platform ที่ใช้ง่ายและเชื่อถือได้ สำหรับ IoT Node ขนาดเล็ก

งานที่เขากำลังทำคือ:

BleRiot

ซึ่งเป็น Request / Response Protocol สำหรับ Low-power RF Nodes

BleRiot ไม่ได้เป็น Feature ของ TinyGo: มันเป็น Project แยก เพียงแต่เป็นหนึ่งใน Use Case ที่ผลักดันให้ผู้พัฒนา อยากมี TinyGo Support ที่ดีบน MCU ราคาประหยัดอย่าง PY32

BleRiot ตั้งใจให้ MCU รู้จักคำสั่งให้น้อยที่สุด

Node เปิด Signed 32-bit Registers ให้ระบบภายนอกใช้งาน

Vocabulary ของ Protocol มี Operation หลักเพียง:

GET
SET

Linux Hub เป็นฝ่ายรับผิดชอบงานอย่าง:

  • Register Names
  • Unit Conversion
  • Retry
  • Timeout

แนวคิดคือ Firmware บน Node ไม่ต้องแบก Logic ที่ซับซ้อนเกินความจำเป็น

ถ้า MCU เล็ก ก็ให้ Hub ฉลาดกว่า: แทนที่จะให้ Node RAM ไม่กี่ KB ต้องเข้าใจ Dashboard, Retry, MQTT และ Data Presentation ทุกอย่าง งานเหล่านั้นถูกย้ายไปฝั่ง Linux Hub

ชื่อ BleRiot แต่อย่าเข้าใจว่าเป็น Bluetooth LE

BleRiot ใช้ Custom Radio Link:

250 kbps GFSK

พร้อม BLE-compatible Packet Framing

แต่ Source ย้ำว่า:

ไม่ใช่ Bluetooth LE และไม่ใช่ GATT

Reference Node

ใช้:

  • PY32F030x8
  • PAN211x 2.4 GHz Radio

Hub

ใช้ USB Radio Dongle เป็นตัวสื่อสารกับ Node หลายตัว

Registry ทำให้ค่า Register กลายเป็นข้อมูลที่ Application ใช้งานได้

BleRiot Publish ค่า Node ไปยัง:

Registry

ซึ่งเป็น Lightweight Local Service

Register แต่ละตัว สามารถมี:

  • Name
  • Current Value
  • Optional Metadata
  • Time-to-live หรือ TTL

เมื่อ Value ไม่ถูก Update ตามเวลาที่กำหนด ระบบสามารถ Mark ว่าข้อมูล Stale และ Expire ได้

Application สามารถเข้าถึง Registry ผ่าน HTTP / JSON API

จาก MCU RAM 3 KB ไปถึง Grafana ได้ โดย MCU ไม่ต้องรู้จัก Grafana

Registry มี Integration สำหรับระบบระดับสูงขึ้น เช่น:

  • Node-RED
  • MQTT ผ่าน Standard MQTT Nodes
  • Prometheus
  • Grafana

Built-in Prometheus Endpoint สามารถเปิด Numeric Registers เป็น Gauge สำหรับนำไปแสดงบน Dashboard ได้

PY32 Sensor Node

BleRiot Radio

Linux Hub

Registry

HTTP / JSON • Node-RED • MQTT • Prometheus

Grafana / Applications

นี่คือภาพใหญ่ของ Architecture: MCU ขนาดเล็ก ไม่ต้องรู้จัก Grafana หรือ Dashboard เพียงทำหน้าที่ Sensor / Actuator Node ให้เล็กและ Predictable แล้วให้ Hub รับงานระดับ System ต่อ

TinyGo, BleRiot และ Registry ต้องแยกกันให้ชัด

ทั้งสามอย่างเกี่ยวข้องกัน ใน Use Case ของผู้พัฒนา แต่ไม่ได้เป็น Package เดียวกัน

Project หน้าที่
TinyGo Compiler / Embedded Software Platform สำหรับเขียน Go บน MCU
BleRiot Low-power RF Request / Response Protocol สำหรับ Node และ Hub
Registry Local Service สำหรับจัดการ Register Value, Metadata, TTL และ API

TinyGo PY32 Support ไม่ได้บังคับให้ใช้ BleRiot และไม่ได้ผูก PY32 กับ Radio รุ่นใดรุ่นหนึ่ง

อะไรยังต้องพัฒนาต่อใน PY32 Port?

TinyGo 0.42 เน้น Foundation ก่อน:

  • Runtime Stability
  • Correct Memory Maps
  • GPIO
  • Serial Communication

พื้นที่ที่ยังเปิดให้พัฒนาต่อ:

  • Portable ADC Driver
  • Portable I2C Driver
  • Portable SPI Driver
  • Portable PWM Driver
  • Board Definitions เพิ่มเติม

Generated device/py32 Register Layer เป็นพื้นฐาน ให้คนที่ต้องการเขียน Driver ต่อจากจุดนี้ได้

ส่วนท้ายของบทความ CNX ยังมี Note ว่า TinyGo Support สำหรับ AT32 MCU ดูเหมือนจะเป็นงานถัดไป แต่ประเด็นนั้นแยกออกจาก PY32 Support ที่เป็นหัวข้อหลักของบทความนี้

ภาพ Board และ Project Template เพิ่มเติม

Hero แสดงภาพ PY32 เพียงภาพเดียว ส่วน Media เพิ่มเติม ถูกซ่อนไว้ใน View more แบบ Pure CSS

EmbedFire PY32F030 และ PY32F002B development boards
Development Board ราคาประหยัด EmbedFire PY32F030 และ PY32F002B ซึ่งมี Dedicated TinyGo Targets ใน TinyGo 0.42
TinyGo PY32 project template
TinyGo PY32 Project Template ของ Pavel Burgr สำหรับเริ่มจาก Blink Example และ Project Structure

ถ้าจะเริ่มกับ PY32 จริง แนะนำเปิด Source ต้นฉบับควบคู่กัน

โดยเฉพาะเรื่อง:

  • Target Name
  • Memory Configuration
  • pyOCD Device
  • SWD Setup
  • Current Peripheral Support
  • TinyGo Version

แนะนำให้อ่านต้นฉบับ: เปิด TinyGo 0.42 adds support for Puya PY32 บน CNX Software เพื่อดูรายละเอียด Port และเปิด TinyGo 0.42.0 Release เพื่อตรวจ Release Information ของ TinyGo เวอร์ชันจริง

FAQ: TinyGo + Puya PY32

TinyGo 0.42 รองรับ PY32 กี่รุ่น?

Source ระบุ 87 concrete MCU configurations ครอบคลุม 40 device-definition families ไม่ใช่ Development Board 87 รุ่น

มี Board Target สำเร็จรูปกี่รุ่นในข่าวนี้?

สองรุ่น: EmbedFire PY32F030 และ EmbedFire PY32F002B

รองรับ Cortex-M4 ด้วยไหม?

รองรับ PY32 Target Coverage ใน TinyGo 0.42 ครอบคลุมทั้ง Cortex-M0+ และ Cortex-M4

MCU เล็กสุดมี RAM เท่าไร?

Range ที่ Source ระบุ ลงไปถึง 2 KB SRAM และ 8 KB Flash

GPIO ใช้ผ่าน machine API ได้ไหม?

ได้ GPIO เป็นหนึ่งใน Peripheral ที่มี Portable machine API ใน PY32 Port รอบนี้

UART ใช้ได้หรือไม่?

ได้ รวมถึง UART ตัวที่สอง ใน MCU บางรุ่น ตาม Source

I2C ใช้ machine API ได้หรือยัง?

TinyGo 0.42 PY32 Port ยังไม่มี Portable machine Driver สำหรับ I2C แต่ Generated Register Definitions สามารถใช้กับ Low-level Code ได้

แล้ว SPI, ADC และ PWM ล่ะ?

เช่นเดียวกัน Source ระบุว่ายังไม่มี Portable machine Drivers สำหรับ ADC, SPI และ PWM ใน Release นี้

ทั้งสอง EmbedFire Board ใช้ Blink Code เดียวกันได้ไหม?

ได้ เพราะทั้งสอง Board Definition กำหนด machine.LED เป็น Alias ของ LED ตัวที่สอง

Flash ผ่าน USB ได้เลยไหม?

ตัวอย่างใน Source ใช้ Supported SWD Probe และ pyOCD ก่อนเรียก tinygo flash จึงควรยึด Programming Method ตาม Target ที่ใช้งานจริง

มี Target สำหรับ Custom Board หรือไม่?

มี Bare-chip Targets สำหรับ MCU Configuration ต่าง ๆ ซึ่งสามารถใช้เป็นฐาน สำหรับ Custom Board ได้

BleRiot มากับ TinyGo 0.42 หรือไม่?

ไม่ BleRiot เป็น Project แยก ที่ผู้พัฒนาใช้เป็นหนึ่งใน Motivation สำหรับทำ PY32 Port

BleRiot คือ Bluetooth LE ใช่ไหม?

ไม่ Source ระบุว่าใช้ Custom 250 kbps GFSK Radio Link พร้อม BLE-compatible Packet Framing แต่ไม่ใช่ Bluetooth LE และไม่ใช่ GATT

Registry คืออะไร?

เป็น Lightweight Local Service ที่จัดการ Register Name, Value, Metadata และ TTL และเปิด HTTP/JSON API ให้ Application ใช้งาน

PY32 Node ต่อ Grafana โดยตรงหรือไม่?

ไม่จำเป็น Architecture ที่ Source ยกตัวอย่าง ให้ Registry / Prometheus และระบบฝั่ง Hub รับหน้าที่เชื่อมต่อ Dashboard แทน MCU

จุดน่าสนใจไม่ใช่แค่ “เขียน Go บน MCU ได้” แต่คือมีฐานให้ไปต่อจริง

TinyGo 0.42 ทำให้ Puya PY32 เข้าใกล้คำว่า “หยิบบอร์ดมาแล้วเริ่ม Project ได้” มากขึ้น

เพราะมีทั้ง:

  • Chip Targets
  • Correct Memory Maps
  • Generated Registers
  • GPIO
  • UART
  • EmbedFire Board Definitions
  • SWD / pyOCD Flash Path
  • Project Template

แต่ก็ยังไม่ใช่จุดที่ Peripheral ทุกอย่างพร้อมแบบ Plug-and-play

ADC, I2C, SPI และ PWM ยังเป็นพื้นที่ที่ต้องมี Portable Driver เพิ่มเติม

สำหรับ Maker ที่อยากลอง Embedded Go บน MCU ต้นทุนต่ำ TinyGo 0.42 จึงเป็นก้าวที่น่าสนใจ โดยเฉพาะถ้าต้องการเรียนรู้ตั้งแต่ Board Abstraction ไปจนถึงระดับ Register โดยไม่ต้องออกจากภาษา Go

References / แหล่งข้อมูลต้นฉบับ

อยากลอง Embedded Project แต่ยังไม่รู้จะเริ่มจาก Board ไหน?

ถ้ากำลังหา Development Board, Microcontroller Board, Programmer / Debugger, Sensor หรือ Module สำหรับเริ่มงาน Embedded และ Maker สามารถเข้ามาดูสินค้า พูดคุยกับ Community หรือส่งโจทย์ให้ทีม Globalbyte ช่วยแนะนำอุปกรณ์ได้

สำหรับ EmbedFire PY32F030 และ PY32F002B บทความนี้ไม่ได้ยืนยัน Stock ของ Globalbyte แนะนำให้สอบถามทีมผ่าน LINE OA หากต้องการเช็กอุปกรณ์ที่มี หรือหา Board ทางเลือกสำหรับทดลอง Embedded Project

 


Blog posts