Programming STM32 with Arduino over USB: BluePill and BlackPill (STM32 F1/F4)
บทความนี้กล่าวถึง ขั้นตอนการเขียนโปรแกรมด้วย Arduino IDE สำหรับบอร์ดไมโครคอนโทรลเลอร์ Blue-Pill / Maple Mini และ Black-Pill โดยใช้บอร์ด Raspberry Pi 4 B เป็นคอมพิวเตอร์สำหรับผู้ใช้แบบ Linux / Desktop
บอร์ดไมโครคอนโทรลเลอร์ ที่ใช้ตัวประมวลผล 32-bit ARM Cortex-M3 หรือ M4F เช่น STM32F103 และ STM32F411 ของบริษัท ST เป็นอีกตัวเลือกหนึ่งที่น่าสนใจ เพราะมีราคาถูก (ดูรายการตัวอย่าง Low-Cost STM32 MCU Boards)
บอร์ด Maple Mini และ Blue-Pill มีตัวประมวลผลที่ทำงานด้วยความเร็ว 72MHz (max.) มีหน่วยความจำ SRAM 20KB และ Flash 64KB (STM32F103C8) หรือ 128KB (STM32F103B8) ให้เลือกใช้
บอร์ด WeAct BlackPill เป็นรุ่นใหม่กว่าและมีตัวประมวลผล STM32F401CCU6 (84MHz, 256KB Flash, 64KB SRAM) หรือ STM32F411CEU6 (100MHz, 512KB Flash, 128KB SRAM) ให้เลือกใช้
จุดเด่นที่สำคัญของบอร์ดตามที่กล่าวไปนั้น คือ มีความสามารถเชื่อมต่อผ่าน USB ได้โดยตรง และเขียนโปรแกรมด้วย Arduino ได้เช่นกัน
รายการอุปกรณ์
- บอร์ด STM32F103 ราคาถูกอย่างเช่น Blue-Pill หรือ Maple-Mini
- บอร์ด STM32F401 / STM32F411 ราคาถูกอย่างเช่น Black-Pill
- บอร์ด Raspberry Pi 4 Model B + Raspbian OS สำหรับใช้เป็น Linux-based Host / Desktop Computer
- แผงต่อวงจร (Breadboard) และสายไฟ Jumper Wires
- อุปกรณ์ ST-LINK/V2 USB Dongle
หัวข้อการเรียนรู้
- ตัวเลือก USB Bootloader สำหรับ STM32 อย่างเช่น USB DFU และ UF2
- การติดตั้ง USB DFU Bootloader “stm32duino-bootloader” สำหรับ STM32F103 เพื่อใช้งานร่วมกับ STM32duino Board Support Package (BSP) และเขียนโปรแกรมด้วย Arduino IDE โดยใช้ Raspberry Pi 4B เป็น Desktop Computer
- การเชื่อมต่อบอร์ด BluePill ผ่าน Chrome Web Browser เพื่อใช้งานในรูปแบบที่เรียกว่า WebUSB DFU และลองอัปโหลดไฟล์
.bin
ไปยังบอร์ดดังกล่าว - การเขียนโปรแกรม Arduino สำหรับบอร์ด Black-Pill STM32F411
USB Bootloaders สำหรับ STM32
การอัปโหลดหรืออัปเกรดไฟล์ประเภทเฟิร์มแวร์ (Firmware Upload / Upgrade) ไปยังหน่วยความจำ Flash ของไมโครคอนโทรลเลอร์ STM32 ทำได้หลายวิธี
โดยทั่วไป เราก็จะใช้อุปกรณ์ เช่น ST-Link/V2 หรือ ST-Link/V3 USB Programmer หรืออาจมีการรวมวงจรนี้ไว้บนบอร์ดแล้ว เช่น บอร์ด ST Nucleo เป็นต้น
บริษัท ST ก็ได้พัฒนาซอฟต์แวร์ เพื่อนำมาใช้ร่วมกับอุปกรณ์ดังกล่าว ได้แก่ ST-LINK Utility หรือซอฟต์แวร์ STM32CubeProg หรือจะใช้โปรแกรม OpenOCD ที่เป็น Open Source ก็ได้
แต่ในหลายกรณี ก็จะใช้วิธีการเชื่อมต่อแบบ Serial (ใช้ขา Tx/Rx ของ USART1 ต่อผ่านอุปกรณ์ USB-to-Serial ไปยังคอมพิวเตอร์) และต้องใช้งานร่วมกับ Serial Bootloader ที่อยู่ภายในหน่วยความจำ Flash ของไมโครคอนโทรลเลอร์ เมื่อจะโปรแกรม ก็ต้องเข้าโหมด Serial Bootloader (ในกรณีของ STM32F103 ก็ต้องกำหนดระดับลอจิกที่ขา Boot Pins ดังนี้ จากตำแหน่งปรกติ BOOT0=0, BOOT1=0
ให้เป็น BOOT0=1, BOOT1=0
แล้วรีเซตบอร์ด เพื่อเข้าสู่โหมด “system memory boot mode”) และใช้ร่วมกับโปรแกรมอย่างเช่น STM32 Flash loader demonstrator หรือ stm32loader.py
(Python Script)
ในกรณีที่ไมโครคอนโทรลเลอร์รองรับการใช้งานพอร์ต USB โดยตรง ก็มีอีกหนึ่งช่องทางในการอัปโหลดเฟิร์มแวร์ ซึ่งก็คือ วิธีการที่เรียกว่า USB DFU (Device Firmware Update) แต่ไมโครคอนโทรลเลอร์จะต้องมีเฟิร์มแวร์ที่ทำหน้าที่เป็น DFU Bootloader อยู่ภายใน และสามารถเข้าสู่โหมด DFU ได้ (กำหนดโดยระดับลอจิกของขา Boot Pin ที่ใช้สำหรับวัตถุประสงค์ดังกล่าว)
การทำงานในโหมด DFU Bootloader เช่น สำหรับไมโครคอนโทรลเลอร์ STM32 โดยใช้พอร์ต USB ก็ทำให้มีความสะดวก ไม่จำเป็นต้องใช้อุปกรณ์หรือฮาร์ดแวร์เสริม
บริษัท ST ก็ได้พัฒนาหรือมีตัวอย่างเฟิร์มแวร์สำหรับ USB DFU Bootloader ให้ใช้งาน และใช้งานควบคู่กับีซอฟต์แวร์แบบ GUI ที่มีชื่อว่า DfuSe (DFU with ST Microsystems extensions) สำหรับผู้ใช้ หรือจะใช้คำสั่ง เช่น DFU Utility แบบ Command Line สำหรับ Linux ก็ได้
ไมโครคอนโทรลเลอร์ของ STM32 ในหลายตระกูล รองรับการทำงานในโหมด USB DFU เนื่องจากมี Bootloader อยู่ภายในแล้ว
ตัวอย่าง USB DFU Bootloader (Open Source) สำหรับ STM32F103
นอกจากวิธี USB DFU อีกวิธีหนึ่งที่ได้เริ่มมีการใช้งาน ก็คือ การใช้ UF2 (USB Flashing Format) พัฒนาโดย Michał Moskal และทีมงานที่บริษัท Microsoft สำหรับโครงการ Microsoft PXT / MakeCode เพื่อนำมาใช้กับบอร์ด BBC Micro:bit
UF2 ช่วยให้การอัปโหลดหรืออัปเกรดเฟิร์มแวร์ ทำได้สะดวกมากขึ้น เมื่อเชื่อมต่อบอร์ดไมโครคอนโทรลเลอร์กับ USB ของเครื่องคอมพิวเตอร์ผู้ใช้แล้ว จะมองเห็นเป็นไดรฟ์ (Flash Drive) เนื่องจากทำงานได้ในโหมด USB MSC (Mass Storage Class) และเราสามารถลากไฟล์ เช่น .uf2
ลงในไดร์ฟดังกล่าว จากนั้นจะเริ่มขั้นตอนการอัปเกรดเฟิร์มแวร์โดยอัตโนมัติ
ตัวอย่าง UF2 Bootloader (Open Source) สำหรับไมโครคอนโทรลเลอร์ 32 บิต (ตระกูล ARM) ที่รองรับการใช้งาน USB เช่น
- https://github.com/mmoskal/uf2-stm32f103 (STM32F103)
- https://github.com/mmoskal/uf2-stm32f (STM32F1/F3/F4/F7)
- https://github.com/microsoft/uf2-samdx1 (SAMD21 / SAMD51)
- https://github.com/adafruit/Adafruit_nRF52_Bootloader (nRF528x)
การใช้คำสั่ง openocd ร่วมกับอุปกรณ์ ST-LINK/V2
การเขียนไฟล์เฟิร์มแวร์ เช่น Bootloader ไปยัง Flash ของไมโครคอนโทรลเลอร์ STM32 จะอาศัยโปรแกรม เช่น OpenOCD สำหรับ Linux เพื่อใช้งานร่วมกับอุปกรณ์ ST-Link/V2 และเชื่อมต่อด้วยวิธี SWD (Serial Wire Debug) และใช้ขาสัญญาณ 2 เส้น คือ SWCLK (Clock) และ SWDIO (Data)
ถ้ายังไม่เคยใช้งานคำสั่งนี้ ใน Linux / Ubuntu ก็ทำคำสั่งต่อไปนี้
$ sudo apt-get install openocd
ถ้าเคยคิดตั้งใช้งานไว้แล้ว ก็ให้ลองตรวจสอบว่า สามารถใช้คำสั่ง openocd
ได้หรือไม่ ตามตัวอย่างต่อไปนี้
$ openocd -vOpen On-Chip Debugger 0.10.0+dev-01372-gfa9a4d4db-dirty (2020-08-04-10:54)
การติดตั้งและใช้งาน STM32duino Bootloader
ในส่วนนี้เป็นการลองโค้ด Arduino Sketch สำหรับ STM32 โดยใช้ซอฟต์แวร์ Arduino IDE และ Arduino STM32 BSP (Board Support Package) ที่ดูแลโดย Roger Clark
ขั้นตอนแรกจะต้องติดตั้งและใช้งาน “STM32duino Bootloader” (Maple Bootloader v2.0) เพื่อใช้ USB เป็นช่องทางในการอัปโหลดไฟล์ไปยังไมโครคอนโทรลเลอร์ดังกล่าว
ให้ดาวน์โหลดไฟล์จาก Github: generic_boot20_pc13.bin
ถ้าเลือกใช้บอร์ด BluePill (64KB Flash, LED pin = PC13)
https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/bootloader_only_binaries/
แต่ถ้าเลือกใช้บอร์ด Maple-Mini (128KB Flash, LED Pin=PB1) ให้ใช้ไฟล์ maple_mini_boot20.bin
คำสั่งแรกคือ การลบหน่วยความจำ Flash ทั้งหมดของ STM32F103
$ openocd -f interface/stlink.cfg -f target/stm32f1x.cfg \
-c "init" -c "reset init" \
-c "stm32f1x unlock 0; reset halt" \
-c "flash erase_sector 0 0 last" \
-c "reset" -c "shutdown"
ตัวอย่างข้อความเอาต์พุตที่ได้จากการทำคำสั่ง
Open On-Chip Debugger 0.10.0+dev-01372-gfa9a4d4db-dirty (2020-08-04-10:54)
Licensed under GNU GPL v2
For bug reports, read http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 1000 kHz
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.211067
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
Info : device id = 0x20036410
Info : flash size = 64kbytes
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
erased sectors 0 through 63 on flash bank 0 in 0.025133sshutdown command invoked
คำสั่งถัดไปคือ การเขียนไฟล์ เช่น generic_boot20_pc13.bin
ไปยัง STM32F103
$ openocd -f interface/stlink.cfg -f target/stm32f1x.cfg \
-c "init" -c "reset init" \
-c "program generic_boot20_pc13.bin verify 0x8000000" \
-c "reset" -c "exit"
ตัวอย่างข้อความเอาต์พุตจากการทำคำสั่ง
Open On-Chip Debugger 0.10.0+dev-01372-gfa9a4d4db-dirty (2020-08-04-10:54)
Licensed under GNU GPL v2
For bug reports, read http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 1000 kHz
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.223809
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
Info : device id = 0x20036410
Info : flash size = 64kbytes
** Programming Finished **
** Verify Started **
** Verified OK **
หลังจากนั้น เราจะเห็น LED บนบอร์ด กระพริบถี่ ๆ และกระพริบช้าลง และดับไป ทุกครั้งที่มีการกดปุ่มรีเซตบนบอร์ด
จากนั้นให้ถอดอุปกรณ์ ST-Link/V2 ออก และเสียบสาย USB เพื่อเชื่อมต่อบอร์ด STM32-BluePill กับพอร์ต USB ของคอมพิวเตอร์ผู้ใช้
ลองทำคำสั่ง lsusb
เพื่อตรวจสอบดูว่า มองเห็นอุปกรณ์หรือไม่
$ lsusbBus 002 Device 003: ID 05e3:0617 Genesys Logic, Inc.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 107: ID 1eaf:0004
Bus 001 Device 020: ID 046d:c31d Logitech, Inc. Media Keyboard K200
Bus 001 Device 019: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
เราจะมองเห็นรายการ USB Device ที่มี Product ID / Vendor ID ตรงกับ 1eaf:0004
ลองใช้คำสั่ง dfu-util
เพื่อตรวจสอบการทำงานในโหมด DFU
ถ้ายังไม่เคยใช้งานคำสั่งนี้ ให้ติดตั้งโปรแกรม dfu-util
โดยทำคำสั่งดังนี้
$ sudo apt-get install dfu-util
ให้กดปุ่ม Reset ที่บอร์ด BluePill และขณะที่ LED กำลังกระพริบอยู่นั้น (ก่อนที่ LED จะดับไป) ให้ทำคำสั่งดังนี้
$ sudo dfu-util --list
ตัวอย่างข้อความเอาต์พุต (บางส่วน)
Found DFU: [1eaf:0003] ver=0201, devnum=57, cfg=1, intf=0, path="1-1.2.4", alt=2, name="STM32duino bootloader v1.0 Upload to Flash 0x8002000", serial="LLM 003"Found DFU: [1eaf:0003] ver=0201, devnum=57, cfg=1, intf=0, path="1-1.2.4", alt=1, name="STM32duino bootloader v1.0 Upload to Flash 0x8005000", serial="LLM 003"Found DFU: [1eaf:0003] ver=0201, devnum=57, cfg=1, intf=0, path="1-1.2.4", alt=0, name="STM32duino bootloader v1.0 ERROR. Upload to RAM not supported.", serial="LLM 003"
จะเห็นได้ว่า สามารถมองเห็นบอร์ด Blue-Pill ที่มีการใช้งาน STM32duino Bootloader
การติดตั้ง Arduino STM32 สำหรับบอร์ด STM32
ขั้นตอนถัดไป เป็นการติดตั้ง Arduino STM32 (“stm32duino”) BSP ให้กับ Arduino IDE ดังนั้น จะต้องติดตั้ง Arduino IDE ก่อนทำขั้นตอนต่อไปนี้ (ลองศึกษาขั้นตอนจากบทความ “การติดตั้ง Arduino IDE สำหรับ Raspberry Pi 4B + Raspbian OS”)
เปิดโปรแกรม Arduino IDE แล้วไปที่เมนู Preferences แล้วเพิ่มรายการต่อไปนี้ลงใน Additional Board Manager URLs
ถ้าเป็น Linux / Ubuntu (64-bit) ก็ใส่ URL ต่อไปนี้
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
แต่ถ้าเป็น Raspberry Pi ให้ใช้ URL ต่อไปนี้
https://raw.githubusercontent.com/koendv/stm32duino-raspberrypi/master/BoardManagerFiles/package_stm_index.json
จากนั้นไปที่ Tools > Board > Boards Manager เพื่อติดตั้ง STM32duino
คำสั่งต่อไปนี้ เพื่อติดตั้ง udev rules และ สร้าง soft links สำหรับไฟล์ maple_upload.sh
และ dfu-util.sh
$ cd ~/.arduino15/packages/STM32/tools/STM32Tools/1.4.0/tools/linux
$ sudo ./install.sh
$ ln -s maple_upload ./maple_upload.sh
$ ln -s dfu-util/dfu-util ./dfu-util.sh
$ cd ~
มาลองเขียนโค้ด Arduino Sketch คอมไพล์โค้ดและทำขั้นตอน Build & Upload ดังนี้
//#define LED_PIN PC13 // for Blue-Pill
//#define LED_PIN PB1 // for Maple-Mini
#define LED_PIN LED_BUILTINbool state = false;void setup() {
pinMode( LED_PIN, OUTPUT );
Serial.begin(115200);
}void loop() {
digitalWrite( LED_PIN, state = !state );
Serial.printf( "LED state: %d\n", state );
delay(500);
}
ตัวอย่างการตั้งค่าสำหรับขั้นตอน Build & Upload: ให้เลือกบอร์ดเป็น Generic STM32F1 Series > Part Number: BluePill F103CB
เมื่อทำขั้นตอนอัปโหลดได้แล้ว จะเห็นว่า LED กระพริบตามระยะเวลาที่กำหนดไว้ในโค้ด
ข้อสังเกต: ถ้าทำขั้นตอน Upload แล้ว เชื่อมต่อกับ DFU Bootloader ไม่ได้ ให้เลื่อนตำแหน่งของ Jumper ที่ขา BOOT1 จาก 0 ไปอยู่ตำแหน่งที่ 1 แล้วกดปุ่ม Reset ของบอร์ด แล้วปล่อย และทำขั้นตอน Upload อีกครั้ง
การใช้ WebUSB DFU ผ่านเว็บเบราว์เซอร์
ถัดไป เราจะมาลองสิ่งที่เรียกว่า “WebUSB DFU” และดูว่า สามารถมองเห็นอุปกรณ์ดังกล่าวในโหมด DFU โดยใช้ Chrome Web Browser ได้หรือไม่ (สำหรับ Raspberry Pi ให้ใช้โปรแกรม Chromium Browser) เปิดเว็บทดสอบตาม URL ต่อไปนี้
https://devanlai.github.io/webdfu/dfu-util/
เมื่อเปิดหน้าเว็บดังกล่าวแล้ว ให้เลือกอุปกรณ์จากเมนู Vendor ID (Hex) โดยเลือกเป็น “stm32duino bootloader” จากนั้น ให้กดปุ่มรีเซตของบอร์ด และจึงกดปุ่ม Connect บนหน้าเว็บ
เมื่อเชื่อมต่อได้แล้ว จะเห็นรายการดังต่อไปนี้ (เหมือนการทำคำสั่ง dfu-util -l
ในเครื่องคอมพิวเตอร์ Linux ของผู้ใช้)
จากนั้นเลือกรายการ “Upload to Flash 0x8002000”
ถัดไปเราจะมาลองอัปโหลดไฟล์ .bin
ไปยังบอร์ด BluePill โดยใช้ Arduino Sketch ที่เคยได้ทำไว้แล้ว และสามารถค้นหาได้ในไดเรกทอรี /tmp
โดยทำคำสั่งต่อไปนี้ และตัวอย่างข้อความเอาต์พุต
$ ls -c1 /tmp/arduino_build_*/*.bin/tmp/arduino_build_722763/stm32f103_led_blink.ino.bin
บนหน้าเว็บ ในส่วนที่เป็น DFU mode — Firmware Download ให้กดปุ่ม Choose File แล้วเลือกไฟล์ .bin
ของ Arduino Sketch ที่เคยได้คอมไพล์ไว้แล้วมาเป็นไฟล์ตัวอย่างในการทดสอบ
เมื่อเลือกแล้วก็ให้กดปุ่ม Download
ถ้าทำได้สำเร็จ เราจะเห็น LED กระพริบ และถ้าจะเชื่อมต่อใหม่ผ่านทาง WebUSB DFU ก็ให้กดปุ่มรีเซตบนแล้ว แล้วกดปุ่ม Connect บนหน้าเว็บอีกครั้ง
จากตัวอย่างนี้ เราพอจะเห็นได้ว่า การโปรแกรมบอร์ดไมโครคอนโทรลเลอร์ผ่าน USB และใช้ Web Browser สามารถทำได้เช่นกัน และมีแนวโน้มต่อไปที่จะเห็นรูปแบบที่เรียกว่า Web-based Firmware Update แพร่หลายมากขึ้น
การเขียนโปรแกรม Arduino สำหรับ BlackPill
ถัดไปเป็นการลองเขียนโค้ด Arduino สำหรับ Black-Pill (STM32F411CE) สามารถใช้โค้ดเดิมตามตัวอย่างที่แล้ว
ข้อสังเกต: เมื่อเขียนโปรแกรมด้วย STM32duino ตัวประมวลผลของบอร์ด Black-Pill จะทำงานด้วยความเร็ว 96 MHz
วิธีสำหรับการอัปโหลดเฟิร์มแวร์ไปยังบอร์ดที่แนะนำให้ลองใช้คือ วิธีแรกคือ การใช้อุปกรณ์ ST-LINK/V2 (SWD) และอีกวิธีที่สองคือ การเชื่อมต่อด้วย USB ในโหมด DFU USB Bootloader
วิธีที่หนึ่ง) ถ้าใช้อุปกรณ์ ST-LINK/V2 (SWD) โปรแกรม Arduino IDE จะเรียกใช้คำสั่งจากไฟล์ชื่อ stm32CubeProg.sh
โดยอัตโนมัติ และจะมีการใช้เรียกคำสั่ง st-flash
อีกต่อหนึ่ง เมื่อทำขั้นตอน Upload
~/.arduino15/packages/STM32/tools/STM32Tools/1.4.0/tools/linux/stm32CubeProg.sh
ตัวอย่างข้อความเอาต์พุต
/home/pi/.arduino15/packages/STM32/tools/STM32Tools/1.4.0/tools/linux/stm32CubeProg.sh 0 /tmp/arduino_build_759113/stm32f411_blackpill_led_blink.ino.bin -g
st-flash 1.6.0
2020-08-14T14:40:58 INFO common.c: stm32f411re: 128 KiB SRAM, 512 KiB flash in at least 16 KiB pages.
file /tmp/arduino_build_759113/stm32f411_blackpill_led_blink.ino.bin md5 checksum: 81b614dc2987afb79bb3f56e2c4b143, stlink checksum: 0x002a0bdb
2020-08-14T14:40:58 INFO common.c: Attempting to write 27500 (0x6b6c) bytes to stm32 address: 134217728 (0x8000000)
EraseFlash - Sector:0x0 Size:0x4000 2020-08-14T14:40:58 INFO common.c: Flash page at addr: 0x08000000 erased
EraseFlash - Sector:0x1 Size:0x4000 2020-08-14T14:40:58 INFO common.c: Flash page at addr: 0x08004000 erased
2020-08-14T14:40:58 INFO common.c: Finished erasing 2 pages of 16384 (0x4000) bytes
2020-08-14T14:40:58 INFO common.c: Starting Flash write for F2/F4/L4
2020-08-14T14:40:58 INFO flash_loader.c: Successfully loaded flash loader in sram
enabling 32-bit flash writes
2020-08-14T14:40:59 INFO common.c: Starting verification of write complete
size: 27500
2020-08-14T14:40:59 INFO common.c: Flash written and verified! jolly good!
st-flash 1.6.0
2020-08-14T14:40:59 INFO common.c: stm32f411re: 128 KiB SRAM, 512 KiB flash in at least 16 KiB pages.
ถ้ามีปัญหาในการอัปโหลด ให้ลองกดปุ่ม BOOT0 ค้างไว้แล้วตามด้วยปุ่มรีเซต
วิธีที่สอง) การโปรแกรมในโหมด DFU USB Bootloader
การทำให้บอร์ด STM32F411CEU6 รีบูทใหม่ แล้วเข้าสู่โหมด DFU มีดังนี้
- เชื่อมต่อขา A10 (PA10/USB_FS_ID) ด้วยตัวต้านทาน Pullup เช่น 10k ไปยัง VCC (3.3V) และเสียบสายไฟเชื่อมต่อระหว่างขา A9 และ A10
- เสียบสาย USB-C เชื่อมต่อบอร์ดไมโครคอนโทรลเลอร์กับคอมพิวเตอร์
- กดปุ่ม BOOT0 ก่อน โดยกดค้างไว้ แล้วจึงกดปุ่ม RESET
- ปล่อยปุ่ม RESET และ BOOT0 ตามลำดับ
แก้ไขไฟล์ stm32CubeProg.sh
ในส่วนที่เกี่ยวข้องกับการเรียกใช้คำสั่ง dfu-util
ดังนี้ ซึ่งจะต้องเปลี่ยนหมายเลขอุปกรณ์จากเดิม -d 1eaf:0003
ให้กลายเป็น -d 0483:df11
คำสั่งเดิม (ใช้สำหรับบอร์ดที่ได้ติดตั้ง stm32duino-bootloader ใน 8KB แรกของ Flash Memory)
$TOOLDIR/dfu-util/dfu-util -D ${FILEPATH} -d 1eaf:0003 --intf 0 --alt 2
คำสั่งใหม่ (ใช้สำหรับ DfuSE bootloader ของ STM32F4)
$TOOLDIR/dfu-util/dfu-util -D ${FILEPATH} -d 0483:df11 -a 0 -s 0x08000000:mass-erase:force -t 1024
เมื่อทำขั้นตอน Upload แล้ว ให้กดปุ่มรีเซตบนบอร์ดไมโครคอนโทรลเลอร์
โดยสรุป เราได้เห็นขั้นตอนการติดตั้งซอฟต์แวร์สำหรับบอร์ด Raspberry Pi + Raspbian OS (สามารถนำไปปรับใช้กับ Linux/Ubuntu ได้) เพื่อนำมาเขียนโปรแกรมสำหรับบอร์ดไมโครคอนโทรลเลอร์ที่มีราคาถูก เช่น STM32F103 และ STM32F411