การเขียนโค้ด Arduino และดีบักการทำงานของชิป Espressif ESP32-C3 ด้วย PIO Debug / USB-JTAG#


Espressif ESP32-C3 SoC#

ชิป ESP32-C3 ของบริษัท Espressif เป็นชิปประเภท SoC ที่รองรับการเชื่อมต่อแบบไร้สายทั้ง Wi-Fi และ Bluetooth Low Energy (BLE) ภายในประกอบด้วยซีพียูสถาปัตยกรรม 32-bit RISC-V (RV32IMC ISA)

บอร์ดไมโครคอนโทรลเลอร์ ESP32-C3 มีราคาไม่แพง และสามารถเขียนโค้ดด้วยภาษา C/C++ โดยใช้ตัวเลือกต่อไปนี้ได้

  • Arduino IDE + Arduino ESP32 Core
  • VS Code IDE + PlatformIO extension
  • VS Code IDE + Espressif ESP-IDF extension

ชิปหลายรุ่นของ Espressif เช่น ESP32-C3, ESP32-S2, ESP32-S3 และ ESP32-C6 รองรับการเชื่อมต่อผ่าน USB โดยตรง โดยสามารถสื่อสารข้อมูลในรูปแบบ USB-CDC (Serial) และบางรุ่นยังมีวงจร USB-to-JTAG สำหรับใช้อัปโหลดเฟิร์มแวร์และการดีบักระดับฮาร์ดแวร์ของซีพียูผ่าน JTAG Interface

ถ้าเป็น ESP32 (รุ่นแรก) และต้องการดีบักการทำงานของโปรแกรมด้วยฮาร์ดแวร์ จะต้องใช้อุปกรณ์อย่างเช่น ESP-Prog ซึ่งใช้ชิป FT2232HL ของบริษัท FTDI ทำหน้าที่เป็นอุปกรณ์ USB-to-JTAG/Serial

ในปัจจุบัน การทำขั้นตอน JTAG Debugging สำหรับชิป ESP32 รุ่นใหม่ (เช่น ESP32-C3, ESP32-S3) ซึ่งรองรับ Native USB นั้นก็ทำได้ง่ายและสะดวก ไม่ต้องมีอุปกรณ์เสริม ในส่วนของซอฟต์แวร์ จะใช้โปรแกรม OpenOCD for ESP32 ซึ่งจะต้องใช้งานร่วมกับโปรแกรม GDB Debugger และเป็นซอฟต์แวร์ประเภท Open Source

รูป: บล็อกไดอะแกรมอธิบายองค์ประกอบที่สำคัญสำหรับ ESP32 JTAG Debugging

บทความนี้นำเสนอแนวทางการใช้งานซอฟต์แวร์ VS Code IDE ร่วมกับ PlatformIO extension (ทดลองใช้งานบนระบบปฏิบัติการ Linux) พร้อมตัวอย่างโค้ด Arduino Sketch สำหรับสาธิตการอัปโหลดและดีบักการทำงานของโปรแกรมบนชิป ESP32-C3

แนะนำให้ผู้อ่านได้ติดตั้งโปรแกรม VS Code IDE และ PlatformIO (PIO) ตามลำดับก่อน

 


▷ ขั้นตอนการพัฒนาโค้ด Arduino Sketch สำหรับ ESP32-C3 ด้วย PlatformIO#

ขั้นตอนการดำเนินการมีดังนี้

  1. สร้างโปรเจกต์ใหม่: เปิด VS Code แล้วไปที่เมนู “PIO Home” → “New Project” จากนั้นตั้งชื่อโปรเจกต์, เลือกไดเรกทอรีเก็บโปรเจกต์, เลือกบอร์ดที่ใช้ชิป ESP32-C3 และเลือก Arduino เป็น Framework
  2. ทดลองใช้โค้ดตัวอย่าง Arduino Sketch: เขียนหรือวางโค้ด Arduino ที่ต้องการลงในไฟล์ src/main.cpp ซึ่งเป็นไฟล์หลักของโปรเจกต์
  3. แก้ไขไฟล์ platformio.ini: ปรับแต่งคอนฟิก เช่น เพิ่มการตั้งค่าพอร์ต ความเร็วอัปโหลด หรือเปิดการดีบัก ตามตัวอย่างที่ให้
  4. คอมไพล์โปรเจกต์ (Build): ใช้คำสั่ง “Build” จากเมนูของ PlatformIO เพื่อตรวจสอบว่าโค้ดสามารถคอมไพล์ได้โดยไม่มีข้อผิดพลาด
  5. เชื่อมต่อบอร์ด ESP32-C3: ต่อบอร์ดเข้ากับคอมพิวเตอร์ผ่านสาย USB
  6. อัปโหลดเฟิร์มแวร์: ใช้คำสั่ง “Upload” เพื่ออัปโหลดเฟิร์มแวร์ไปยังบอร์ด ESP32-C3 ผ่านพอร์ต USB
  7. ดีบักโค้ด (PIO Debug): เริ่มขั้นตอนดีบักด้วยคำสั่ง “Start Debugging” สามารถกำหนดตำแหน่ง Breakpoints ในโค้ด แล้วรันโปรแกรมแบบควบคุมการทำงานทีละขั้น

รูป: การสร้างโปรเจกต์ใหม่สำหรับ PIO

รูป: ตัวอย่างโค้ดในไฟล์ src/main.cpp ของโปรเจกต์

ตัวอย่างไฟล์ main.cpp

#include <Arduino.h>

// Define the GPIO pin connected to the LED
#define LED_PIN  8

// Variable to hold the current LED state (0 or 1)
int led_value = 0;

void setup() {
   // Set the LED pin as an output
   pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Declare a static counter to track the number of loop iterations
  static int count = 0;

  // Increment the counter on each loop iteration
  count++;

  // Toggle the LED state using bitwise XOR
  led_value ^= 1;

  // Set the LED pin to the current state
  digitalWrite(LED_PIN, led_value);

  // Wait for 100 milliseconds
  delay(100);
}

ตัวอย่างการตั้งค่าใช้งานสำหรับไฟล์ platformio.ini

[env:seeed_xiao_esp32c3]
platform = platform-espressif32
framework = arduino
board = seeed_xiao_esp32c3
build_flags =
  -D CONFIG_USB_CDC_ENABLED=1
  -D ARDUINO_USB_MODE=1
  -D ARDUINO_USB_CDC_ON_BOOT=1
monitor_speed = 115200
upload_protocol = esp-builtin
upload_port = /dev/ttyACM0
debug_tool = esp-builtin
build_type = debug
debug_build_flags = -O0 -g -ggdb
debug_init_break = tbreak setup

คำอธิบาย

  • platform = platform-espressif32 ระบุว่าต้องการใช้แพลตฟอร์มสำหรับบอร์ดตระกูล ESP32 ซึ่งจะติดตั้ง Toolchain และไลบรารี ที่จำเป็นโดยอัตโนมัติ (เช่น ดาวน์โหลดและติดตั้งไว้ภายใต้ไดเรกทอรี $HOME/.platformio/packages/ สำหรับ Linux)
  • framework = arduino กำหนดให้เขียนโปรแกรมโดยใช้ Arduino Framework
  • board = seeed_xiao_esp32c3 ระบุชื่อบอร์ดตามที่ PlatformIO รองรับ เพื่อใช้คอนฟิกค่าพินและค่าพารามิเตอร์ต่างๆ โดยอัตโนมัติ
  • build_flags เป็นการกำหนด Flags สำหรับการคอมไพล์ เช่น การตั้งค่าเพื่อเปิดใช้งาน USB CDC สำหรับ ESP32-C3
  • monitor_speed = 115200 ตั้งค่า Baudrate ของ Serial Monitor ให้ตรงกับที่ใช้ในโค้ด
  • upload_protocol = esp-builtin ใช้โปรโตคอลอัปโหลดที่มากับชิป ESP32-C3 โดยตรงผ่าน USB ซึ่งรองรับ USB-JTAG
  • upload_port = /dev/ttyACM0 ระบุชื่อพอร์ต USB ที่เชื่อมต่อกับ ESP32-C3 ซึ่งอาจเปลี่ยนแปลงไปตามระบบปฏิบัติการ (ตัวอย่างสำหรับ Linux)
  • debug_tool = esp-builtin ใช้ USB-JTAG ที่ฝังอยู่ภายใน ESP32-C3 สำหรับการดีบัก
  • build_type = debug ระบุว่าให้สร้างโปรเจกต์ในโหมดสำหรับการดีบัก (แทน Release)
  • debug_build_flags = -O0 -g -ggdb เป็นการกำหนด Flags สำหรับการคอมไพล์เพื่อดีบัก ปิดการ Optimize และเปิดข้อมูลดีบักเต็มรูปแบบ เพื่อให้สามารถดูตัวแปร และทำงานของ Stack ได้ครบถ้วน
  • debug_init_break = tbreak setup ตั้ง Breakpoint ให้หยุดการทำงานที่จุดเริ่มต้นของฟังก์ชัน setup() ซึ่งช่วยให้วิเคราะห์การทำงานเริ่มต้นได้ง่าย

ข้อสังเกต:

  • หากต้องการระบุเวอร์ชันของ Platform ESP32 Framework ที่ต้องการ ก็ให้ตั้งค่าสำหรับ platform โดยระบุ URL ตามตัวอย่างต่อไปนี้

https://github.com/pioarduino/platform-espressif32/releases/download/54.03.20/platform-espressif32.zip

ใน Linux สามารถทำคำสั่งต่อไปนี้ เพื่อตรวจสอบดูว่า มองเห็นอุปกรณ์ ESP32-C3 และพร้อมใช้งานหรือไม่

$ lsusb | grep Espressif
Bus 001 Device 006: ID 303a:1001 Espressif USB JTAG/serial debug unit

จากข้อความตัวอย่างเอาต์พุต จะเห็นว่า มีรายการอุปกรณ์ของ Espressif (VID:PID = 303a:1001)

 

รูป: ทำขั้นตอน Build เพื่อคอมไพล์โค้ดในโปรเจกต์

เมื่อมีการอัปโหลดโค้ดไปยังบอร์ด ESP32-C3 และเริ่มขึ้นตอนดีบักได้แล้ว ให้สังเกตดูข้อความต่าง ๆ ในหน้าต่าง Debug Console

รูป: เริ่มขั้นตอน PIO Debug และคลิกดู Debug Console

รูป: การหยุดการทำงานของซีพียูชั่วคราวตามตำแหน่งของ BREAKPOINTS ที่ได้กำหนดไว้ในโค้ด

รูป: ดูการเปลี่ยนแปลงและค่าของตัวแปรในโค้ด ซึ่งได้กำหนดไว้ในรายการของ WATCH

 

หากจะลองเขียนโค้ดโดยใช้ FreeRTOS Tasks ก็มีตัวอย่างโค้ดดังนี้

#include <Arduino.h>

#define LED_PIN 8

// Task handles 
TaskHandle_t blinkTaskHandle = NULL;
TaskHandle_t printTaskHandle = NULL;

// Blink Task
void blinkTask(void *pvParameters) {
  int led_state = 0;
  pinMode(LED_PIN, OUTPUT);
  while (true) {
    led_state ^= 1;
    digitalWrite(LED_PIN, led_state);
    vTaskDelay(pdMS_TO_TICKS(100)); // 100 ms
  }
}

// Serial Print Task (USB CDC)
void printTask(void *pvParameters) {
  while (!Serial) {
    vTaskDelay(pdMS_TO_TICKS(100)); // Wait for Serial to be ready
  }

  int counter = 0;
  while (true) {
    Serial.printf("counter: %lu\n", ++counter );
    vTaskDelay(pdMS_TO_TICKS(1000)); // 1 second
  }
}

void setup() {
  Serial.begin();  // Start USB CDC
  // Create two FreeRTOS tasks
  xTaskCreate(blinkTask, "Blink Task", 1024, NULL, 1, &blinkTaskHandle);
  xTaskCreate(printTask, "Print Task", 2048, NULL, 1, &printTaskHandle);
}

void loop() {
  // Nothing here 
}

รูป: ทำขั้นตอนอัปโหลด และเริ่มต้น PIO Debug

รูป: เปิดใช้งาน Serial Monitor เพื่อรับข้อความจาก USB-CDC (Serial) ที่ถูกส่งมาจากบอร์ด

 


▷ การใช้งาน Arduino IDE สำหรับ ESP32-C3 JTAG Debugging#

หากจะลองใช้ซอฟต์แวร์ Arduino IDE v2.3.x (หรือ เวอร์ชันใหม่กว่า) แทนที่การใช้ VS Code IDE + PlatformIO ก็สามารถอัปโหลด Arduino Sketch และดีบักการทำงานของโค้ดโดยใช้บอร์ด ESP32-C3 ได้เช่นกัน ผู้ใช้จะต้องตรวจสอบการตั้งค่าใช้งานให้ถูกต้องก่อน เช่น เลือกใช้งาน JTAG Adapter - Integrated USB JTAG

รูป: การตั้งค่าเพื่อเลือกใช้งาน Integrated USB JTAG

รูป: ตัวอย่างขั้นตอนการดีบักการทำงานของ JTAG Debugging และหยุดชั่วคราวสำหรับ Breakpoints

รูป: ตัวอย่างข้อความที่ได้รับใน Arduino Serial Monitor เมื่อโปรแกรมการทำงานในโหมดดีบัก

 


กล่าวสรุป#

บทความนี้ได้นำเสนอ การใช้งานซอฟต์แวร์ VS Code IDE ร่วมกับ PlatformIO extension ในเบื้องต้น แม้ว่าจะได้ทดลองใช้งานกับระบบปฏิบัติการ Linux แต่ก็มีแนวทางเดียวกันสำหรับ Windows 10 & 11 ได้เรียนรู้ขั้นตอนการสาธิตการอัปโหลดและดีบักการทำงานของโปรแกรมบนชิป ESP32-C3 และเขียนโค้ดตัวอย่างในรูปแบบ Arduino Sketch และมีการใช้ FreeRTOS ในเบื้องต้น

แนะนำบทความภาษาไทยที่เกี่ยวข้องให้ศึกษาเพิ่มเติม

 


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2025-05-02 | Last Updated: 2025-05-05