> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/th/support/knowledge-base/swd-programming.md).

# การแฟลชผ่าน SWD

### SWD คืออะไร <a href="#swd" id="swd"></a>

SWD (Serial Wire Debug) คืออินเทอร์เฟซดีบักและแฟลชแบบสองสายที่ใช้กันทั่วไปในไมโครคอนโทรลเลอร์ ARM สามารถใช้เขียนเฟิร์มแวร์ เข้าถึงหน่วยความจำ ดีบัก และกู้คืน MCU ได้โดยตรง

สำหรับผลิตภัณฑ์ตัวควบคุมการบิน คุณค่าสูงสุดของ SWD คือการทำงานในระดับฮาร์ดแวร์ แม้ Bootloader หรือเฟิร์มแวร์หลักบนบอร์ดจะเสียหายแล้ว ก็ยังมีโอกาสเขียนใหม่ผ่าน SWD เพื่อกู้คืนบอร์ดได้

### เหตุใดตัวควบคุมการบินจึงต้องใช้ SWD <a href="#morakot--swd" id="morakot--swd"></a>

ในการใช้งานตัวควบคุมการบิน ผู้ใช้ส่วนใหญ่จะติดตั้งเฟิร์มแวร์ผ่าน USB และสถานีควบคุมภาคพื้นดิน โดยไม่จำเป็นต้องใช้ SWD โดยตรง

แต่ในกรณีต่อไปนี้ SWD จะเป็นเครื่องมือที่จำเป็น:

* การแฟลช Bootloader ครั้งแรก
* เมื่อเฟิร์มแวร์หรือ Bootloader เสียหาย และบอร์ดไม่สามารถบูตผ่าน USB ได้ตามปกติ
* เมื่อพัฒนาตัวควบคุมการบิน ปรับแต่งเฟิร์มแวร์ หรือดีบักระดับล่าง
* เมื่อโหมด DFU ใช้งานไม่ได้ตามปกติ และต้องเขียนไฟล์อิมเมจลง MCU โดยตรง

### สัญญาณพื้นฐานของ SWD <a href="#swd" id="swd"></a>

สัญญาณหลักของ SWD มีเพียงสองสาย เมื่อรวมกับสายกราวดร่วมอีกหนึ่งเส้นก็สามารถสร้างการเชื่อมต่อพื้นฐานได้

| สัญญาณ | ชื่อ                 | ทิศทาง            | การใช้งาน                           |
| ------ | -------------------- | ----------------- | ----------------------------------- |
| SWDIO  | Serial Wire Data I/O | สองทิศทาง         | ส่งข้อมูลและคำสั่งควบคุม            |
| SWCLK  | Serial Wire Clock    | เครื่องแฟลช → MCU | ให้สัญญาณนาฬิกาสำหรับการสื่อสาร SWD |
| GND    | Ground               | -                 | กราวดอ้างอิงร่วม                    |

ในทางปฏิบัติ พอร์ตดีบักของตัวควบคุมการบินจำนวนมากจะนำสัญญาณ 3.3V, UART TX, UART RX, nRST หรือ SWO ออกมาด้วย เพื่อให้สามารถตรวจสอบการจ่ายไฟ เอาต์พุตการดีบัก หรือควบคุมการรีเซ็ตได้พร้อมกัน

### SWD ทำงานอย่างไร <a href="#swd" id="swd"></a>

เครื่องแฟลช SWD จะเชื่อมต่อกับพอร์ตดีบักภายใน MCU โดยตรง จึงสามารถอ่านและเขียน Flash รีจิสเตอร์ และสถานะของอุปกรณ์ต่อพ่วงบางส่วนได้โดยตรง โดยไม่ต้องพึ่งพาการทำงานปกติของเฟิร์มแวร์หลัก

นี่คือความแตกต่างที่สำคัญที่สุดระหว่าง SWD กับการอัปเกรดเฟิร์มแวร์ผ่าน USB ทั่วไป การอัปเดตผ่าน USB มักต้องให้บอร์ดสามารถเข้าสู่ Bootloader หรือ DFU ได้เป็นอย่างน้อย แต่ SWD สื่อสารกับชิปในระดับที่ลึกกว่า จึงเหมาะอย่างยิ่งสำหรับการกู้คืนและการพัฒนา

### เมื่อใดควรใช้ SWD <a href="#swd" id="swd"></a>

แนะนำให้มอง SWD เป็น "อินเทอร์เฟซสำหรับการซ่อมบำรุงและพัฒนาระดับล่าง" ไม่ใช่วิธีการใช้งานประจำวัน

สถานการณ์ที่เหมาะสมกับการใช้ SWD ได้แก่:

1. เขียน Bootloader ลงบอร์ดใหม่เป็นครั้งแรก
2. แฟลชเฟิร์มแวร์ผิดตัว ทำให้บอร์ดบูตไม่ได้
3. ระบบไม่สามารถตรวจพบ USB ได้ DFU ใช้งานไม่ได้ และต้องกู้คืนเนื้อหาใน Flash โดยตรง
4. ต้องตรวจสอบการเดินสายระดับบอร์ด กระบวนการบูต หรือดีบักทีละขั้นตอน

### ความแตกต่างระหว่างการอัปเดตเฟิร์มแวร์ทั่วไปกับ SWD <a href="#swd" id="swd"></a>

การอัปเดตเฟิร์มแวร์ทั่วไปมักทำผ่านโหมด USB/DFU ของ Mission Planner, QGroundControl หรือ STM32CubeProgrammer

สามารถแยกความแตกต่างระหว่าง SWD กับวิธีทั่วไปได้อย่างง่าย ๆ ดังนี้:

| วิธี                                 | สถานการณ์ที่เหมาะสม                                                                  | เหมาะสำหรับการอัปเดตประจำวันหรือไม่ |
| ------------------------------------ | ------------------------------------------------------------------------------------ | ----------------------------------- |
| แฟลชผ่านสถานีควบคุมภาคพื้นดินทาง USB | การอัปเกรดเฟิร์มแวร์ทั่วไป การบำรุงรักษาตามปกติ                                      | ใช่                                 |
| USB DFU                              | วิธีสำรองเมื่อ Bootloader/เฟิร์มแวร์ผิดปกติ                                          | ขึ้นอยู่กับสถานการณ์                |
| SWD                                  | การแฟลช Bootloader ครั้งแรก การกู้คืนบอร์ดที่ใช้งานไม่ได้ (Brick) การพัฒนาระดับบอร์ด | ไม่ใช่                              |

### เครื่องมือที่ต้องเตรียม <a href="#undefined" id="undefined"></a>

การแฟลชผ่าน SWD ต้องมีเครื่องแฟลชประเภท ST-LINK ที่เข้ากันได้อย่างน้อยหนึ่งตัว เช่น ST-LINK V3 Mini เนื่องจากนอกจาก SWD แล้ว ยังสามารถให้ฟังก์ชันพอร์ตอนุกรมเสมือนผ่านการเชื่อมต่อ USB เดียวกันได้ด้วย

* ST-LINK V2, ST-LINK V3 Mini หรือเครื่องแฟลช SWD อื่นที่เข้ากันได้
* สายแปลงหรือบอร์ดแปลงสำหรับตัวควบคุมการบินที่สอดคล้องกัน
* สาย USB และคอมพิวเตอร์
* เครื่องมือแฟลช เช่น STM32CubeProgrammer หรือ stlink toolchain

### เส้นทางการเชื่อมต่อที่แนะนำ <a href="#undefined" id="undefined"></a>

แนวคิดการเชื่อมต่อสำหรับการแฟลชผ่าน SWD สามารถสรุปเป็นเส้นทางดังนี้:

`คอมพิวเตอร์ ↔ USB ↔ ST-LINK ↔ สายแปลง SWD ↔ Debug Port`

### สภาพแวดล้อมซอฟต์แวร์ <a href="#undefined" id="undefined"></a>

* **ผู้ใช้ Windows**: แนะนำให้ใช้ STM32CubeProgrammer แฟลชผ่านอินเทอร์เฟซกราฟิกเป็นอันดับแรก
* **ผู้ใช้ Linux**: สามารถใช้ stlink toolchain แบบโอเพนซอร์สในการแฟลชและดีบัก

หากต้องทำการพัฒนาระดับบอร์ดและเขียน Bootloader ควรตรวจสอบว่าเครื่องมือเป็นเวอร์ชันที่ใหม่พอ เพื่อหลีกเลี่ยงปัญหาการตรวจจับอุปกรณ์ผิดปกติ

### ข้อผิดพลาดที่พบบ่อย <a href="#undefined" id="undefined"></a>

* **ขั้วต่อหรือวิธีแปลงไม่ถูกต้อง**: พอร์ตของเครื่องแฟลชอาจไม่สามารถเสียบเข้ากับพอร์ตดีบักของตัวควบคุมการบินได้โดยตรง มักต้องใช้บอร์ดแปลงที่สอดคล้องกันหรือตารางเทียบขาที่ถูกต้อง
* **ประเภท Bootloader ไม่ถูกต้อง**: หากแฟลช Bootloader ที่ไม่เข้ากันกับสแต็กเฟิร์มแวร์เป้าหมาย กระบวนการอัปเดตในภายหลังอาจล้มเหลว
* **Flash Address ไม่ถูกต้อง**: ตำแหน่งเริ่มต้นของ Flash ที่พบบ่อยใน STM32 คือ `0x08000000` หากเขียนที่ตำแหน่งผิด อาจแสดงผลว่าสำเร็จ แต่บอร์ดบูตไม่ได้
* **เวอร์ชันเครื่องมือเก่าเกินไป**: เครื่องมือ stlink เวอร์ชันเก่าอาจไม่สามารถตรวจจับ MCU รุ่นใหม่กว่าหรือเฟิร์มแวร์ ST-LINK รุ่นใหม่กว่าได้
* **การจ่ายไฟขัดแย้งกัน**: ST-LINK อาจจ่ายแรงดันเป้าหมาย 3.3V แต่ไม่ควรจ่ายไฟให้อุปกรณ์ต่อพ่วงที่ใช้กระแสสูงผ่านพอร์ตดีบัก และต้องหลีกเลี่ยงการขัดแย้งกับแหล่งจ่ายไฟภายนอกด้วย

### ข้อควรระวัง <a href="#undefined" id="undefined"></a>

**ข้อควรระวัง:** ก่อนเชื่อมต่อ ST-LINK โปรดตรวจสอบว่า SWDIO, SWCLK และ GND ไม่ได้ต่อสลับกัน และอย่าต่อไฟเลี้ยงของโมดูลที่ใช้กระแสสูงเข้ากับพอร์ตดีบักโดยผิดพลาด

**ข้อควรระวัง:** หากบอร์ดยังสามารถแฟลชผ่าน USB และโหมด DFU ได้ตามปกติ แนะนำให้ใช้ขั้นตอนการแฟลชมาตรฐานที่มีอยู่เป็นอันดับแรก แนะนำให้ใช้ SWD เฉพาะเมื่อ Bootloader เสียหาย บูตไม่ได้ หรือในการพัฒนาระดับบอร์ดเท่านั้น

### ขั้นตอนการดำเนินการที่แนะนำ <a href="#undefined" id="undefined"></a>

1. ตรวจสอบพอร์ตดีบักที่สอดคล้องกัน
2. เตรียม ST-LINK และสายแปลง
3. ต่อ SWDIO, SWCLK, GND ตามผังขา และต่อ 3.3V / nRST เมื่อจำเป็น
4. เปิด STM32CubeProgrammer หรือเครื่องมือ stlink
5. เชื่อมต่อและตรวจสอบว่าสามารถตรวจพบ MCU ได้
6. เขียน Bootloader หรืออิมเมจเฟิร์มแวร์ที่กำหนด
7. เมื่อเสร็จแล้ว ให้จ่ายไฟใหม่ และตรวจสอบว่า USB, Bootloader หรือสถานีควบคุมภาคพื้นดินสามารถเชื่อมต่อได้ตามปกติหรือไม่
