# MicroPython Firmware Flashing for STM32

ขั้นตอนการดำเนินการสำหรับบอร์ด **STM32** &#x20;

* ถ้าใช้บอร์ด **WeAct STM32F411CEU6 (Black Pill)** ให้ดาวน์โหลดและติดตั้งไฟล์ [**MicroPython Firmware (pre-built binary file)**](https://github.com/WeActTC/MiniF4-STM32F4x1/tree/master/SDK/STM32F411CEU6/MicroPython) จาก **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**](https://www.st.com/en/development-tools/stsw-link004.html) ถ้าใช้วิธีโปรแกรมผ่าน **SWD** (วิธีที่ 1) หรือ
  * โปรแกรม [**DfuSe**](https://www.st.com/en/development-tools/stsw-stm32080.html#get-software) ถ้าโปรแกรมด้วยวิธี **DFU** (วิธีที่ 2) หรือ
  * โปรแกรม [**STM32CubeProgrammer**](https://www.st.com/en/development-tools/stm32cubeprog.html) (ได้ทั้งวิธีที่ 1 และ 2) <= แนะนำให้เลือกใช้ตัวเลือกนี้ และโปรแกรมสามารถใช้ได้ทั้งกับ **Windows** และ **Linux**
  * โปรแกรม [**dfu-util for Windows**](https://sourceforge.net/projects/dfu-util/files/) เช่น [**dfu-util-0.9-win64.zip**](https://sourceforge.net/projects/dfu-util/files/dfu-util-0.9-win64.zip/download)
* **Linux (Ubuntu, Raspbian OS)**: ให้ติดตั้งโปรแกรม เช่น **openocd, stlink-tools** และ **dfu-util** เพื่อเอาไว้ใช้งาน

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

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

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

![รูปภาพ: อุปกรณ์ ST-Link V2 USB Dongle (Low-Cost)](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdcB-nLCCWrXhTX-Nx%2F-MIdcSsYJ21S-GEl3AYg%2Fstlink_v2_usb_dongle.jpeg?alt=media\&token=19880fcc-fd48-4e6c-b817-18261eb2418f)

![รูปภาพ: การเชื่อมต่ออุปกรณ์ ST-Link/V2 กับบอร์ด STM32F411CEU ที่ขา SWD](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdcB-nLCCWrXhTX-Nx%2F-MIdcV_4fzOWs1wQbCFM%2Fstm32f411_st-link_v2.jpeg?alt=media\&token=198b4d30-d77a-4086-aa6c-4c85eeaadce1)

&#x20;`STM32 (SWD) | ST-Link/V2` \
&#x20;  `GND <----------> GND`\
&#x20;  `SCK <----------> SWCLK`\
&#x20;  `DIO <----------> SWDIO`\
&#x20;  `3V3 <----------> 3.3V`

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

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

![รูปภาพ: ST-Link Utility และเปิดไฟล์ .hex สำหรับ WeAct STM32F411CEU](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIddyz4FJHQ6Uj9gWcd%2F-MIdephtiV3gb3QNVyls%2Fst-link_util_stm32f4_load_hex.png?alt=media\&token=bee2dd64-9b02-4bb6-b0e1-ee1c0d83bcf2)

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

![รูปภาพ: ข้อความแสดงสถานะการทำงานของ ST-Link Utility](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdfphHo933IxWcVCEM%2F-MIdgDeOlcwjQGHnLZZR%2Fst-link_util_stm32f4_flash_complete_message.png?alt=media\&token=a70f4b04-de41-474e-a764-d8aee7c725cc)

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

เมื่อได้ติดตั้งโปรแกรมชื่อ [**DfuSe**](https://www.st.com/en/development-tools/stsw-stm32080.html) ไว้สำหรับการอัปโหลดไฟล์เฟิร์มแวร์ด้วยวิธี **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](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdgSk6sGhJxjVankoA%2F-MIdi6YUCKQYW7RzrdhY%2Fdfuse_hex_to_dfu.png?alt=media\&token=03628d6f-d371-4b1e-93b6-4e1f4af0ba40)

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

![รูปภาพ: แสดงสถานะการมองเห็นอุปกรณ์ STM32 DFU Mode](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdisecd5Qo7uS_gX4o%2F-MIdjYLtxmFsHURDJFci%2Fdfuse_dfu_mode.png?alt=media\&token=3c869425-0c3a-4dfe-a1a5-184019edfca4)

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

![รูปภาพ: แสดงสถานะการเปิดไฟล์ .dfu ได้สำเร็จ](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdk-lLZEVDjOzS3bpq%2F-MIdkUkvWAzKuQtBgOyD%2Fdfuse_dfu_loaded.png?alt=media\&token=136a5295-d4f6-4bc4-a83b-5307db1ee853)

![รูปภาพ: ขั้นตอนการเขียนไฟล์ .dfu ไปยังบอร์ดไมโครคอนโทรลเลอร์](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdisecd5Qo7uS_gX4o%2F-MIdjs2KikaFn-gB6BDv%2Fdfuse_upgrading.png?alt=media\&token=564d5d4f-c6fc-4ba5-9c92-c2af4ccbc3e4)

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

![รูปภาพ: บอร์ด STM32F405RGT6 Core Board](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MQGaLEFPBxDnlMpEjYp%2F-MQGanMwD1CxTL4u7aii%2Fstm32f405_micropython_board.png?alt=media\&token=c8041793-54d9-4e1b-9f46-0777b8a3f37a)

**ปัญหาที่พบ**

ถ้าได้ติดตั้งโปรแกรม [DfuSe ](https://www.st.com/en/development-tools/stsw-stm32080.html)และ [STM32CubeProgrammer](https://www.st.com/en/development-tools/stm32cubeprog.html) ของบริษัท **STMicroelectronics** สำหรับ **Windows 10** จะต้องเลือกใช้ **USB Driver** ให้ถูกต้อง

ลองใช้โปรแกรม [**USB Driver Tool**](https://visualgdb.com/UsbDriverTool/) ตรวจสอบรายการ **USB Drivers** ในระบบ (หรือเปลี่ยนตัวเลือก)

![รูปภาพ: STM32 Bootloader ใช้สำหรับ STM32CubeProgrammer](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MQGZIzeVx7nmbS0a1gI%2F-MQGZSbxdy0xmo9BYgTn%2Fwin10_stm32_dfu_driver-1.png?alt=media\&token=e1e0e21c-6282-4477-897a-ed43b3581a1e)

![รูปภาพ: STM32 Device in DFU Mode ใช้สำหรับ DfuSe Demo ](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MQGZIzeVx7nmbS0a1gI%2F-MQGZosisSEK8vtbM6i4%2Fwin10_stm32_dfu_driver-2.png?alt=media\&token=6e27f54b-0f58-4d4a-b289-ecac481b4af0)

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

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

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

![รูปภาพ: การเลือกอุปกรณ์ ST-LINK](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIgFwhv3jkU-VJ4O4g0%2F-MIgGv55wBqiJY4hMm6e%2Fstm32cubeprog_stlink-1.png?alt=media\&token=d058fd76-9700-4f0a-b35e-662529c6c5e6)

![รูปภาพ: การแฟลชไฟล์ .hex / .dfu ด้วยโปรแกรม STM32CubeProgrammer ](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIdl7gcmau3iZo_eoCG%2F-MIdlYg8umaxfA96KmJ0%2Fstm32cubeprog.png?alt=media\&token=383bee83-4584-4fe3-b5c7-2bec45b48f3a)

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

![รูปภาพ: รายการไฟล์ภายในไดร์ฟของบอร์ด STM32F411CE-MicroPython](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIgN87oakkZBfvC3PeH%2F-MIgQEfdWZoicrFqZRK9%2Fmicropython_stm32f411ce_drive.png?alt=media\&token=92e4e0c7-40cb-4eba-ba21-f2ae1e46574a)

## การใช้โปรแกรม stlink-tools สำหรับ Linux

ตัวอย่างการทำคำสั่งต่อไปนี้ ได้ทดลองใช้กับ **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](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIgIqENyKrQPGVOvc0S%2F-MIgMlZe6jikagMEenXe%2Fstlink_tools_erase_chip_stm32f411.png?alt=media\&token=00f65213-fb29-4f97-af8f-188e32b973b7)

![รูปภาพ: ตัวอย่างการทำคำสั่ง st-flash write](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIgIqENyKrQPGVOvc0S%2F-MIgMp0VzfRdMP0DyRFx%2Fstlink_tools_flashing_stm32f411.png?alt=media\&token=8dcfbfdf-1470-46db-88b9-7f0d94740739)

## การใช้โปรแกรม 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](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIeGYFq5LbDaptxhRvh%2F-MIeJ7O795rfKY0OMong%2Fdfu_util_on_rpi4_connect.png?alt=media\&token=1bd11b5c-bdd2-4b86-a3d2-20632d97a189)

![รูปภาพ: ข้อความที่แสดงสถานะการทำงานของ dfu-util](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIeGYFq5LbDaptxhRvh%2F-MIeIoujmMulDLaG3MaD%2Fdfu_util_on_rpi4_flashing_success.png?alt=media\&token=b70e3805-31d9-4615-85b4-d4e7ee36d42e)

## การใช้โปรแกรม 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 \`\
&#x20; `-c "init" -c "reset init" \`\
&#x20; `-c "stm32f2x unlock 0; reset halt" \`\
&#x20; `-c "flash erase_sector 0 0 last" \`\
&#x20; `-c "reset" -c "shutdown"`

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

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

![ีูรูปภาพ: แสดงข้อความเมื่อทำคำสั่ง openocd เพื่อเขียนไฟล์ .hex](https://969412697-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIHfYo9IV3uTFm2tkDn%2F-MIgUSaTtlWnomuWA9-7%2F-MIgaZcmkZenlAedCIHm%2Fopenocd_stm32f411_flashing.png?alt=media\&token=e830e8e2-c793-46d7-b01c-83c4172f8b02)

## กล่าวสรุป

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

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

{% hint style="info" %}
**เผยแพร่ภายใต้ลิขสิทธิ์**\
**Attribution-ShareAlike 4.0 International (**[**CC BY-SA 4.0**](https://creativecommons.org/licenses/by-sa/4.0/)**)**
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://think-embedded.gitbook.io/micropython/micropython-for-stm32/micropython-firmware-flashing-for-stm32.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
