MicroPython Firmware Flashing for STM32

การติดตั้งไฟล์เฟิร์มแวร์ของไมโครไพธอนสำหรับบอร์ดไมโครคอนโทรลเลอร์ STM32

ขั้นตอนการดำเนินการสำหรับบอร์ด STM32

  • ถ้าใช้บอร์ด WeAct STM32F411CEU6 (Black Pill) ให้ดาวน์โหลดและติดตั้งไฟล์ MicroPython Firmware (pre-built binary file) จาก Github ซึ่งมีประเภทของไฟล์ให้เลือก เช่น .hex หรือ .dfu และยังจำแนกตามรูปแบบการใช้หน่วยความจำ Flash

    • กรณีที่ใช้เฉพาะ Internal Flash (ไม่มี External SPI Flash Chip)

    • กรณีที่ใช้ External SPI Flash 4MB

    • กรณีที่ใช้ External SPI Flash 8MB

  • ถ้าใช้บอร์ด STM32 Nucleo หรือ Discovery ให้ดาวน์โหลดไฟล์ .dfu ได้จาก https://micropython.org/download/stm32/

  • Windows: ให้ดาวน์โหลดซอฟต์แวร์ของบริษัท STMicroelectronics แล้วติดตั้งในระบบให้พร้อมใช้งาน (มีขั้นตอนการรีจิสเตอร์ผู้ใช้ก่อน จึงจะสามารถดาวน์โหลดไฟล์จากเว็บไซต์ของทางบริษัทได้) มีอยู่ 3 ตัวเลือกดังนี้

    • โปรแกรม STM32 ST-Link Utility ถ้าใช้วิธีโปรแกรมผ่าน SWD (วิธีที่ 1) หรือ

    • โปรแกรม DfuSe ถ้าโปรแกรมด้วยวิธี DFU (วิธีที่ 2) หรือ

    • โปรแกรม STM32CubeProgrammer (ได้ทั้งวิธีที่ 1 และ 2) <= แนะนำให้เลือกใช้ตัวเลือกนี้ และโปรแกรมสามารถใช้ได้ทั้งกับ Windows และ Linux

    • โปรแกรม dfu-util for Windows เช่น dfu-util-0.9-win64.zip

  • Linux (Ubuntu, Raspbian OS): ให้ติดตั้งโปรแกรม เช่น openocd, stlink-tools และ dfu-util เพื่อเอาไว้ใช้งาน

ข้อสังเกต: ถ้าใช้บอร์ด STM32 Nucleo หรือ Discovery การแฟลชเฟิร์มแวร์ (Firmware Flashing) สามารถทำได้ง่าย เนื่องจากเมื่อเสียบสาย USB กับคอมพิวเตอร์ จะมองเห็น Virtual Drive (USB Mass Storage) ผู้ใช้สามารถลากไฟล์ .bin ไปวางใส่ได้เลย (Drag & Drop)

การโปรแกรมด้วยวิธี SWD สำหรับ Windows

ถ้ามีอุปกรณ์ ST-Link/V2 สำหรับการโปรแกรมด้วยวิธี SWD ก็สามารถใช้ไฟล์ .hex ได้เลย ในเครื่องคอมพิวเตอร์ (Windows) จะต้องมีการติดตั้งโปรแกรม STM32 ST-Link Utility ไว้แล้ว

รูปภาพ: อุปกรณ์ ST-Link V2 USB Dongle (Low-Cost)
รูปภาพ: การเชื่อมต่ออุปกรณ์ ST-Link/V2 กับบอร์ด STM32F411CEU ที่ขา SWD

STM32 (SWD) | ST-Link/V2 GND <----------> GND SCK <----------> SWCLK DIO <----------> SWDIO 3V3 <----------> 3.3V

การเชื่อมต่อด้วยวิธี SWD จะใช้สายไฟเชื่อมต่อ 4 เส้น ระหว่างบอร์ด STM32 กับอุปกรณ์ ST-Link V2

เมื่อเชื่อมต่อกับบอร์ด STM32 ผ่านทาง ST-Link V2 USB กับคอมพิวเตอร์ได้แล้ว ให้เปิดโปรแกรม STM32 ST-Link Utility จากนั้นไปที่เมนู Target > Connect ถ้าสามารถเชื่อมต่อได้ จะปรากฏข้อความระบุ Device ที่ตรวจพบ

รูปภาพ: ST-Link Utility และเปิดไฟล์ .hex สำหรับ WeAct STM32F411CEU

ถัดไปให้เปิดไฟล์ .hex โดยทำคำสั่งจากเมนู File > Open File แล้วเลือกไฟล์ .hex ที่ต้องการจะโปรแกรมไปยังบอร์ดไมโครคอนโทรลเลอร์ จากนั้นทำขั้นตอน Target > Program & Verify (หรืออาจทำขั้นตอน Erase Chip ก่อนก็ได้ เพื่อเคลียร์หน่วยความจำ Flash ทั้งหมด)

รูปภาพ: ข้อความแสดงสถานะการทำงานของ ST-Link Utility

การโปรแกรมด้วยวิธี DFU สำหรับ Windows

เมื่อได้ติดตั้งโปรแกรมชื่อ DfuSe ไว้สำหรับการอัปโหลดไฟล์เฟิร์มแวร์ด้วยวิธี DFU (USB device firmware upgrade) ถัดไปให้เตรียมอุปกรณ์ฮาร์ดแวร์ดังนี้ (ในกรณีที่ใช้บอร์ด WeAct STM32F411CEU6)

  • เชื่อมต่อขา A10 (PA0/USB_FS_ID) ด้วยสาย Jumper Wire กับตัวต้านทาน 10k แบบ Pullup ไปยัง 3.3V

  • เสียบสาย USB-C เชื่อมต่อบอร์ดไมโครคอนโทรลเลอร์กับคอมพิวเตอร์

  • กดปุ่ม BOOT0 กดค้างไว้ กดปุ่ม RESET แล้วจึงปล่อยปุ่ม RESET และ BOOT0 ตามลำดับ

ถ้าต้องการจะแปลงไฟล์ .hex เป็น .dfu ก็ให้ใช้โปรแกรมชื่อ DFU File Manager ของ DfuSe โดยกดปุ่ม "S19 or Hex" แล้วเลือกไฟล์ .hex ตามด้วยการกดปุ่ม Generate

รูปภาพ: การแปลงไฟล์ .hex ให้เป็น .dfu

ถัดไปให้เปิดโปรแกรม DfuSe Demo ถ้าเชื่อมต่อบอร์ด STM32 แล้วอยู่ในโหมด DFU จะมองเห็น Vendor ID: 0483, Product ID: DF11 และ Version: 2200

รูปภาพ: แสดงสถานะการมองเห็นอุปกรณ์ STM32 DFU Mode

กดปุ่ม Choose… ในส่วนของ Upgrade or Verify Action เลือกไฟล์ .dfu แล้วกดปุ่ม Upgrade เพื่อทำขั้นตอนสุดท้าย

รูปภาพ: แสดงสถานะการเปิดไฟล์ .dfu ได้สำเร็จ

รูปภาพ: ขั้นตอนการเขียนไฟล์ .dfu ไปยังบอร์ดไมโครคอนโทรลเลอร์

ตัวอย่างสำหรับบอร์ด STM32F405 (เข้าสู่ DFU USB Bootloader โดยต่อสายที่ขา BOOT0 กับ 3.3V แล้วกดปุ่มรีเซต) และเลือก MicroPython Firmware: "Firmware for hand-made PYBv3 board"

รูปภาพ: บอร์ด STM32F405RGT6 Core Board

ปัญหาที่พบ

ถ้าได้ติดตั้งโปรแกรม DfuSe และ STM32CubeProgrammer ของบริษัท STMicroelectronics สำหรับ Windows 10 จะต้องเลือกใช้ USB Driver ให้ถูกต้อง

ลองใช้โปรแกรม USB Driver Tool ตรวจสอบรายการ USB Drivers ในระบบ (หรือเปลี่ยนตัวเลือก)

รูปภาพ: STM32 Bootloader ใช้สำหรับ STM32CubeProgrammer
รูปภาพ: STM32 Device in DFU Mode ใช้สำหรับ DfuSe Demo

การใช้งาน STM32CubeProgrammer สำหรับ Windows

เราสามารถใช้ซอฟต์แวร์ STM32CubeProgrammer ซึ่งรองรับการใช้งานได้ทั้ง SWD (ใช้ร่วมกับ ST-Link V2) และ DFU (USB) และเลือกใช้ไฟล์ .hex ได้เลย (ไม่ต้องแปลงเป็น .dfu)

การใช้งานโปรแกรมนี้ ก็ทำได้ง่าย เช่น เลือกใช้ ST-Link แล้วก็เชื่อมต่อกับบอร์ดไมโครคอนโทรลเลอร์ (Connect) จากนั้นเลือกไฟล์ .hex (Open File) แล้วก็กดปุ่ม Download เพื่อเขียนข้อมูลไปยังอุปกรณ์เป้าหมาย

รูปภาพ: การเลือกอุปกรณ์ ST-LINK
รูปภาพ: การแฟลชไฟล์ .hex / .dfu ด้วยโปรแกรม STM32CubeProgrammer

เมื่อติดตั้งเฟิร์มแวร์สำหรับไมโครไพธอนได้สำเร็จแล้ว และนำบอร์ด STM32F411CEU6 ไปเชื่อมต่อเข้ากับพอร์ต USB ของคอมพิวเตอร์ (ใช้สาย USB Type-C) จะมองเห็นไดร์ฟชื่อ STM32F411CE

รูปภาพ: รายการไฟล์ภายในไดร์ฟของบอร์ด STM32F411CE-MicroPython

ตัวอย่างการทำคำสั่งต่อไปนี้ ได้ทดลองใช้กับ Raspbian OS สำหรับบอร์ด Raspberry Pi 4 แต่ก็นำไปใช้กับคอมพิวเตอร์ที่ทำงานด้วย Linux Ubuntu ได้เหมือนกัน

เริ่มต้นด้วยทำคำสั่งติดตั้งโปรแกรมนี้

$ sudo apt-get install stlink-tools

จากนั้นให้เชื่อมต่ออุปกรณ์ ST-Link V2 กับบอร์ด STM32F411CEU6 และพอร์ต USB ของคอมพิวเตอร์ แล้วทำคำสั่งต่อไปนี้ เพื่อลบข้อมูลทั้งหมดในหน่วยความจำ Flash (Full Chip Erase) และเขียนไฟล์ .hex ไปยังอุปกรณ์ ตามลำดับ

$ st-flash erase

$ st-flash --reset write firmware_internal_rom_stm32f411_v1.12-540.hex 0x8000000

รูปภาพ: ตัวอย่างการทำคำสั่ง st-flash erase
รูปภาพ: ตัวอย่างการทำคำสั่ง st-flash write

การใช้โปรแกรม dfu-util สำหรับ Linux

ตัวอย่างการทำคำสั่งต่อไปนี้ ได้ทดลองใช้กับ Raspbian OS สำหรับบอร์ด Raspberry Pi 4 แต่ก็สามารถนำไปใช้กับคอมพิวเตอร์ที่ทำงานด้วย Linux Ubuntu ได้เหมือนกัน

เริ่มต้นด้วยการทำให้บอร์ด STM32 เข้าโหมด DFU Bootloader Mode ก่อน จากนั้นจึงทำคำสั่งดังต่อไปนี้ เพื่อติดตั้งโปรแกรม แล้วจึงตรวจสอบดูว่า สามารถมองเห็นอุปกรณ์ในโหมด DFU หรือไม่

$ sudo apt-get install dfu-util

$ dfu-util -d 0483:df11 -l

จากนั้นให้ทำคำสั่งเพื่อเขียนไฟล์ .dfu ไปยังหน่วยความจำ Flash ภายในชิป STM32 (ในตัวอยางนี้ได้ดาวน์โหลดไฟล์ .dfu ที่เป็นเฟิร์มแวร์ของไมโครไพธอนเวอร์ชัน v1.12 สำหรับบอร์ด WeAct STM32F411CEU6 มายังคอมพิวเตอร์ของผู้ใช้แล้ว)

$ dfu-util -a 0 -D ./firmware_internal_rom_stm32f411_v1.12-540.dfu

รูปภาพ: ข้อความแสดงสถานะการเชื่อมต่อกับอุปกรณ์ในโหมด DFU

รูปภาพ: ข้อความที่แสดงสถานะการทำงานของ dfu-util

การใช้โปรแกรม OpenOCD สำหรับ Linux

โปรแกรม openocd รองรับการใช้งานอุปกรณ์ ST-LINK V2 เราจะมาลองใช้งานเป็นตัวอย่าง ตัวอย่างการทำคำสั่งต่อไปนี้ ได้ทดลองใช้กับ Raspbian OS สำหรับบอร์ด Raspberry Pi 4 แต่ก็สามารถนำไปใช้กับคอมพิวเตอร์ที่ทำงานด้วย Linux Ubuntu ได้เหมือนกัน

เริ่มต้นด้วยการติดตั้งใช้งานโปรแกรมนี้ก่อน

$ sudo apt-get install openocd libftdi-dev

ถัดไปให้สร้างไฟล์ ./target_stm32f4.cfg ซึ่งเป็นการตั้งค่าการใช้งาน (OpenOCD Configuration Settings) ดังนี้

source [find interface/stlink.cfg] transport select hla_swd source [find target/stm32f4x.cfg] telnet_port disabled gdb_port disabled reset_config none separate adapter speed 980

เชื่อมต่ออุปกรณ์ให้พร้อม จากนั้นทำคำสั่งเพื่อลบข้อมูลในหน่วยความจำ Flash ของอุปกรณ์เป้าหมาย โดยทำคำสั่งดังนี้

$ openocd -f ./target_stm32f4.cfg \ -c "init" -c "reset init" \ -c "stm32f2x unlock 0; reset halt" \ -c "flash erase_sector 0 0 last" \ -c "reset" -c "shutdown"

คำสั่งถัดไปคือ การเขียนข้อมูลจากไฟล์เฟิร์มแวร์ไปยังอุปกรณ์เป้าหมาย

$ export FIRMWARE=./firmware_internal_rom_stm32f411_v1.12-540.hex $ openocd -f ./target_stm32f4.cfg \ -c "init" -c "reset init" \ -c "program $FIRMWARE verify 0x8000000" \ -c "reset" -c "exit"

ีูรูปภาพ: แสดงข้อความเมื่อทำคำสั่ง openocd เพื่อเขียนไฟล์ .hex

กล่าวสรุป

เราได้เห็นวิธีการและเครื่องมือประเภทซอฟต์แวร์ต่าง ๆ ที่เป็นตัวเลือกสำหรับการติดตั้งเฟิร์มแวร์ของไมโครไพธอน เพื่อให้ใช้ได้งานกับบอร์ดไมโครคอนโทรลเลอร์ STM32 เช่น STM32F411CEU6

เมื่อได้ติดตั้งเฟิร์มแวร์สำหรับไมโครไพธอนได้แล้ว ถัดไปก็สามารถลองใช้โปรแกรมอย่างเช่น Thonny IDE เชื่อมต่อไปยังบอร์ดไมโครคอนโทรลเลอร์ และทดลองเขียนโค้ดตามตัวอย่างในเนื้อหาถัดไป

เผยแพร่ภายใต้ลิขสิทธิ์ Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)

Last updated

Was this helpful?