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 ตั้งแต่วันแรก
ก่อนอ่านต่อ มี 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
machineAPI รอบนี้ครอบคลุม Clock/Timer Startup, GPIO และ UART - ADC, I2C, SPI และ PWM ยังไม่มี Portable
machineDrivers - 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 คนละขนาดได้
↓
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
เริ่มพิธีกรรม Embedded แบบเดิม: Blink LED
Source ให้ Blink Example แบบ TinyGo ที่ใช้ machine.LED และ time.Sleep() โดยตรง
package main
import (
"machine"
"time"
)
func main() {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.Set(true)
time.Sleep(500 * time.Millisecond)
led.Set(false)
time.Sleep(500 * time.Millisecond)
}
}
tinygo flash -target=embedfire-py32f030 .
tinygo flash -target=embedfire-py32f002b .
Flash ไม่ใช่แค่เสียบ USB แล้วกด Upload
Source ระบุว่า การ Flash ตัวอย่าง ใช้:
- Supported SWD Probe
- pyOCD
- pyOCD Configuration ที่ตรงกับ Puya Device
หลังจาก Environment พร้อมแล้ว จึงใช้คำสั่ง tinygo flash พร้อม Board Target
เตรียม TinyGo Project
สร้างไฟล์ Go หรือใช้ Project Template จากผู้พัฒนา
ต่อ SWD Probe
เชื่อม Debug / Programming Interface กับ PY32 Board ตาม Hardware ที่ใช้งาน
ตั้ง pyOCD ให้ตรง Device
Board Target จะอ้างอิง pyOCD Target ที่ตรงกับ Puya MCU
เลือก 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 หลักเพียง:
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 ได้
↓
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
ถ้าจะเริ่มกับ 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