บทเรียน 1.1 — เครื่องมือ บอร์ด และ master template

ติดตั้ง ModusToolbox เตรียม master template ของ TESAIoT Firmware Stack แล้ว build และ flash ครั้งแรก

TESAIoT Dev Kit · PSoC Edge E84 · ภาษา C · ModusToolbox

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เป้าหมาย

เมื่อจบบทเรียนนี้ คุณจะ

  1. ติดตั้ง ModusToolbox และ clone master template แล้ว build ผ่านโดยไม่มี error
  2. วางไฟล์ของ episode ลงใน proj_cm55/apps/ แล้ว flash ลงบอร์ดผ่าน KitProg3 ได้
  3. อธิบายบทบาทของ proj_cm33_s, proj_cm33_ns และ proj_cm55 ในชิปสองคอร์
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม — สิ่งที่ต้องมี

  • TESAIoT Dev Kit (PSoC Edge AI Kit SoM บนบอร์ดฐาน QWA309) และสาย USB-C สำหรับ KitProg3
  • ModusToolbox ของ Infineon รุ่น 3.6 ขึ้นไปตาม README ของ master template (README ของชุด episode แนะนำ 3.8)
  • git และเครื่องที่ build ภาษา C ได้ (Windows, macOS หรือ Linux)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ดูของจริงก่อน

ถ้ายังไม่พร้อม build เอง ให้เปิดตัวอย่างบน Developer Hub แล้ว flash เฟิร์มแวร์สำเร็จรูปจากหน้าตัวอย่าง (episode ในโมดูล 2–3 และแบบฝึก QWA309 ในโมดูล 4 มีเฟิร์มแวร์พร้อมใช้ทุกตัว)

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — สามโปรเจกต์บนชิปสองคอร์

PSoC Edge E84 เป็นชิปสองคอร์ (Cortex-M55 + Cortex-M33) ModusToolbox แบ่ง firmware เป็นสามโปรเจกต์ แยก build/flash กัน แต่ประสานงานกันตอน boot

โปรเจกต์ คอร์ deps/ หน้าที่
proj_cm33_s CM33 secure ว่าง ตั้ง MPC/PPC แล้วกระโดดไป non-secure
proj_cm33_ns CM33 non-secure ว่าง เปิดคอร์ CM55 แล้วเข้า deep sleep
proj_cm55 CM55 15 แพ็กเกจ LVGL, GPU, เซนเซอร์, Wi-Fi, episode

proj_cm33_s/proj_cm33_ns ไม่ลิงก์ middleware เลย — งานจอ งาน Wi-Fi และ sensor bus ของทุก episode อยู่ใน proj_cm55 ทั้งหมด

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — proj_cm33_ns ปลุก CM55 แล้วหลับ

โค้ดจาก tesaiot/developer-hub (Apache-2.0) · commit 082fd3e · proj_cm33_ns/main.c

/* Enable CM55. */
Cy_SysEnableCM55(MXCM55, CM55_APP_BOOT_ADDR,
                  CM55_BOOT_WAIT_TIME_USEC);
__enable_irq();

/* Put the CPU to Deep Sleep */
for (;;)
{
    Cy_SysPm_CpuEnterDeepSleep(
        CY_SYSPM_WAIT_FOR_INTERRUPT);
}

CM55_BOOT_WAIT_TIME_USEC = 10 µs หลังจากนี้ proj_cm33_ns ไม่ทำอะไรอีกเลย งานทั้งหมดตกไปที่ proj_cm55

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — proj_cm55 เรียก episode เป็นขั้นตอนสุดท้าย

proj_cm55/main.c — cm55_gfx_task()

lv_init();
lv_port_disp_init();
lv_port_indev_init();

/* EPISODE ENTRY POINT —
 * main.c NEVER changes per episode.
 * apps/ provides a strong example_main(),
 * or the weak _default/ stub runs instead. */
lv_obj_t *parent = lv_scr_act();
example_main(parent);

example_main(parent) ถูกเรียกครั้งเดียว หลัง GFX, I2C, จอ, sensor bus, VGLite และ LVGL พร้อมหมดแล้ว

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — sensor bus init แบบ best-effort

cy_rslt_t r = sensor_i2c_controller_init();
if (CY_RSLT_SUCCESS != r)
{
    printf("[MASTER] Sensor I2C init failed "
           "(0x%08lx)\r\n", (unsigned long)r);
}

cy_rslt_t r3 = i3c_controller_init();
if (CY_RSLT_SUCCESS != r3)
{
    printf("[MASTER] I3C init failed "
           "(0x%08lx)\r\n", (unsigned long)r3);
}

ล้มเหลวแค่ printf แจ้งเตือนแล้ว boot ต่อ ไม่ assert หยุด — I2C คุม DPS368/SHT4x/BMI270, I3C คุม BMM350

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — สัญญา example_main แบบ weak/strong

proj_cm55/apps/app_interface.h:

#include "app_interface.h"

/* Episode MUST provide a strong definition: */
void example_main(lv_obj_t *parent);

master มี example_main() แบบ weak ใน apps/_default/ เป็นค่าเริ่มต้น เมื่อ episode ประกาศแบบ strong linker จะเลือกของ episode แทนอัตโนมัติ — ห้ามลบ app_interface.h ไม่งั้น episode คอมไพล์ไม่ผ่าน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — โฟลเดอร์ apps/ และการติดตั้ง episode

ทุก episode วางไฟล์ ทั้งหมด ลงใน proj_cm55/apps/ เพียงโฟลเดอร์เดียว ไม่ต้องแก้ Makefile (INCLUDES ใช้ find ./apps -type d auto-discover)

ไฟล์ระบบสองอย่างที่ต้องอยู่คู่โฟลเดอร์นี้เสมอ: app_interface.h และ _default/

tools/install_episode.sh ทำให้อัตโนมัติในคำสั่งเดียว: ลบ episode เก่า (เก็บไฟล์ระบบไว้) → rsync episode ใหม่ → ล้าง build cache

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — ทรัพยากรที่พร้อมใช้ก่อน episode เริ่ม

เมื่อ example_main(parent) ถูกเรียก ทุกอย่างนี้พร้อมแล้วโดยไม่ต้อง init เอง

  • LVGL 9 ครบ widget + ฟอนต์ Montserrat 12–40
  • GPU VGLite เร่งทุก draw call
  • Touch (GT911/FT5406/ILI2511) ผูกกับ LVGL แล้ว
  • Sensor bus I2C (1.8V) และ I3C
  • ไมโครโฟน PDM สอง channel
  • Wi-Fi (cy_wcm + lwIP + mbedTLS), FreeRTOS tickless idle
  • printf() ออก debug UART 115200 baud
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

จุดที่มักพลาด

  • Build ค้างที่ proj_cm33_s ด้วย schema cydesignfile_v7 not found → มีคน save design.modus ด้วย configurator 3.7 ทับ schema v6 เดิม
  • duplicate symbol example_main ตอน link → มี strong example_main มากกว่าหนึ่งไฟล์ใน apps/**
  • multiple definition of APP_LOGO → episode พก app_logo.c มาเองทั้งที่ master มีให้แล้ว
  • Sensor I2C/I3C init ล้มเหลวแบบเงียบ → ดู log [MASTER] Sensor I2C init failed / [MASTER] I3C init failed
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — ทักษะที่ฝึกในบทเรียนนี้

บทเรียนนี้พัฒนาทักษะต่อไปนี้ (ตามระดับ 1–5 ของหลักสูตร)

  • build.vendor-sdk (ระดับ 2)
  • build.make-cmake (ระดับ 2)
  • build.compilers (ระดับ 1)
  • vcs.git (ระดับ 1)
  • hw.architecture (ระดับ 1)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แล็บ: build และ flash ครั้งแรก — ขั้น 1

clone master template จาก branch tesaiot_dev_kit_master ของ Developer Hub

git clone -b tesaiot_dev_kit_master https://github.com/tesaiot/developer-hub.git tesaiot_dev_kit_master
cd tesaiot_dev_kit_master
make getlibs
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แล็บ: build และ flash ครั้งแรก — ขั้น 2

build และ flash ตามขั้นตอนใน README ของ master template

# ในโฟลเดอร์ master template (ดูบทเรียน 1.1)
# 1) ลบไฟล์ของ episode เก่าใน proj_cm55/apps/
# 2) คัดลอกไฟล์ทั้งหมดของ episode นี้ลงใน proj_cm55/apps/
make build
make program     # flash ผ่าน KitProg3
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ฝึกเติม / แล็บ — ขั้น 3 (สำรอง)

ถ้ายังไม่พร้อม build เอง ให้เปิดตัวอย่างบน Developer Hub แล้ว flash เฟิร์มแวร์สำเร็จรูปจากหน้าตัวอย่าง (episode ในโมดูล 2–3 และแบบฝึก QWA309 ในโมดูล 4 มีเฟิร์มแวร์พร้อมใช้ทุกตัว)

ทำสำเร็จเมื่อ:

  • ติดตั้ง ModusToolbox และ clone master template แล้ว build ผ่านโดยไม่มี error
  • วางไฟล์ของ episode ลงใน proj_cm55/apps/ แล้ว flash ลงบอร์ดผ่าน KitProg3 ได้
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เช็กความเข้าใจ

  • ไฟล์ของ episode ต้องวางไว้ที่ไหน และห้ามลบไฟล์ใดในโฟลเดอร์นั้น
  • ใน master template งานจอและงาน Wi-Fi อยู่ใน proj_cm55 ทั้งคู่ แล้ว proj_cm33_ns ทำอะไร และถ้าย้ายงานเครือข่ายไปไว้อีกคอร์จะได้และเสียอะไร
  • make build ผ่านแต่ make program ไม่เจอบอร์ด ควรตรวจอะไรก่อน
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ไปต่อ

  • ทบทวนเป้าหมายทั้ง 3 ข้อของบทเรียนนี้ก่อนไปต่อ
  • ถ้าตอบคำถามหน้าที่แล้วไม่ได้ครบ กลับไปอ่าน README ของตัวอย่างส่วน Why / What / How อีกครั้ง
  • พร้อมแล้วไปเปิดบทเรียนถัดไปในโมดูลเดียวกัน
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แหล่งอ้างอิง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เครดิต

"TESAIoT Firmware Stack: เฟิร์มแวร์ภาษา C บน TESAIoT Dev Kit" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ตัวอย่างโค้ดเป็นผลงานของ TESAIoT Firmware Stack โดยสมาคมสมองกลฝังตัวไทย (TESA) ใน tesaiot/developer-hub รายละเอียดการให้เครดิตอยู่ที่ ATTRIBUTION.md

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0