From 53de825c4c4d8325c02341177f62ab84897eb5ee Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Sat, 25 Jul 2026 22:09:43 +0800
Subject: [PATCH] update vscode task.json and add stm32flash tools

---
 ex1.buzzer-music/.vscode/tasks.json      |   43 ++-----
 /dev/null                                |    0 
 ex1.servo-sg90/.vscode/tasks.json        |   43 ++-----
 ex1.ws2812b/.vscode/tasks.json           |   43 ++-----
 stm32flash/bin/arm-none-eabi-objcopy.exe |    0 
 stm32flash/stm32flash.bat                |  147 ++++++++++++++++++++++++
 ex1.auto-light/.vscode/tasks.json        |   43 ++-----
 stm32flash/bin/readme.txt                |    5 
 stm32flash/bin/stm32flash.exe            |    0 
 stm32flash/config.ini                    |    4 
 10 files changed, 208 insertions(+), 120 deletions(-)

diff --git a/ex1.auto-light/.vscode/stm32flash.bat b/ex1.auto-light/.vscode/stm32flash.bat
deleted file mode 100644
index 0bcacc9..0000000
--- a/ex1.auto-light/.vscode/stm32flash.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-setlocal
-
-set OBJCOPY=%GCC_BIN%\arm-none-eabi-objcopy.exe
-set PORT=%1
-
-echo ==^ Converting ELF to BIN...
-%OBJCOPY% -O binary %ELF% %BIN%
-if errorlevel 1 (
-    echo objcopy failed!
-    exit b 1
-)
-
-echo ==^ Flashing via %PORT% ...
-%FLASH_EXE% -w %BIN% -v -g 0x0 -b 115200 %PORT%
-if errorlevel 1 (
-    echo stm32flash failed!
-    exit b 1
-)
-
-echo ==^ Done.
\ No newline at end of file
diff --git a/ex1.auto-light/.vscode/tasks.json b/ex1.auto-light/.vscode/tasks.json
index c8d0ec6..3079dd6 100644
--- a/ex1.auto-light/.vscode/tasks.json
+++ b/ex1.auto-light/.vscode/tasks.json
@@ -2,22 +2,16 @@
     "version": "2.0.0",
     "tasks": [
         {
-            "label": "STM32: Flash via ST-Link(SWD)",
+            "label": "STM32: Flash via ST-Link (SWD)",
             "type": "shell",
-            "command": "D:\\Program Files\\ST\\STM32CubeProgrammer\\bin\\STM32_Programmer_CLI.exe",
+            "command": "cube",
             "args": [
-                "-c port=SWD",
-                "-e all",
-                "-w",
-                "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                "0x08000000",
-                "-v",
+                "programmer",
+                "-c", "port=SWD", "freq=4000", "reset=HWrst",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
                 "-rst"
             ],
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -26,26 +20,15 @@
             }
         },
         {
-            "label": "STM32: Flash via stm32flash(UART)",
+            "label": "STM32: Flash via Serial (UART)",
             "type": "shell",
-            "command": "${workspaceFolder}/.vscode/stm32flash.bat",
+            "command": "cube",
             "args": [
-                "${input:comPort}"
+                "programmer",
+                "--connect", "port=${input:comPort}",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf"
             ],
-            "options": {
-                "env": {
-                    "PATH": "${env:PATH}",
-                    "SystemRoot": "${env:SystemRoot}",
-                    "GCC_BIN": "${env:LOCALAPPDATA}\\stm32cube\\bundles\\gnu-tools-for-stm32\\14.3.1+st.2\\bin",
-                    "ELF": "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                    "BIN": "${workspaceFolder}\\build\\Release\\ISKBoard.bin",
-                    "FLASH_EXE": "${workspaceFolder}\\.vscode\\stm32flash.exe"
-                }
-            },
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -62,4 +45,4 @@
             "default": "COM22"
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/ex1.buzzer-music/.vscode/stm32flash.bat b/ex1.buzzer-music/.vscode/stm32flash.bat
deleted file mode 100644
index 0bcacc9..0000000
--- a/ex1.buzzer-music/.vscode/stm32flash.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-setlocal
-
-set OBJCOPY=%GCC_BIN%\arm-none-eabi-objcopy.exe
-set PORT=%1
-
-echo ==^ Converting ELF to BIN...
-%OBJCOPY% -O binary %ELF% %BIN%
-if errorlevel 1 (
-    echo objcopy failed!
-    exit b 1
-)
-
-echo ==^ Flashing via %PORT% ...
-%FLASH_EXE% -w %BIN% -v -g 0x0 -b 115200 %PORT%
-if errorlevel 1 (
-    echo stm32flash failed!
-    exit b 1
-)
-
-echo ==^ Done.
\ No newline at end of file
diff --git a/ex1.buzzer-music/.vscode/stm32flash.exe b/ex1.buzzer-music/.vscode/stm32flash.exe
deleted file mode 100644
index a50272f..0000000
--- a/ex1.buzzer-music/.vscode/stm32flash.exe
+++ /dev/null
Binary files differ
diff --git a/ex1.buzzer-music/.vscode/tasks.json b/ex1.buzzer-music/.vscode/tasks.json
index c8d0ec6..3079dd6 100644
--- a/ex1.buzzer-music/.vscode/tasks.json
+++ b/ex1.buzzer-music/.vscode/tasks.json
@@ -2,22 +2,16 @@
     "version": "2.0.0",
     "tasks": [
         {
-            "label": "STM32: Flash via ST-Link(SWD)",
+            "label": "STM32: Flash via ST-Link (SWD)",
             "type": "shell",
-            "command": "D:\\Program Files\\ST\\STM32CubeProgrammer\\bin\\STM32_Programmer_CLI.exe",
+            "command": "cube",
             "args": [
-                "-c port=SWD",
-                "-e all",
-                "-w",
-                "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                "0x08000000",
-                "-v",
+                "programmer",
+                "-c", "port=SWD", "freq=4000", "reset=HWrst",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
                 "-rst"
             ],
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -26,26 +20,15 @@
             }
         },
         {
-            "label": "STM32: Flash via stm32flash(UART)",
+            "label": "STM32: Flash via Serial (UART)",
             "type": "shell",
-            "command": "${workspaceFolder}/.vscode/stm32flash.bat",
+            "command": "cube",
             "args": [
-                "${input:comPort}"
+                "programmer",
+                "--connect", "port=${input:comPort}",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf"
             ],
-            "options": {
-                "env": {
-                    "PATH": "${env:PATH}",
-                    "SystemRoot": "${env:SystemRoot}",
-                    "GCC_BIN": "${env:LOCALAPPDATA}\\stm32cube\\bundles\\gnu-tools-for-stm32\\14.3.1+st.2\\bin",
-                    "ELF": "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                    "BIN": "${workspaceFolder}\\build\\Release\\ISKBoard.bin",
-                    "FLASH_EXE": "${workspaceFolder}\\.vscode\\stm32flash.exe"
-                }
-            },
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -62,4 +45,4 @@
             "default": "COM22"
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/ex1.servo-sg90/.vscode/stm32flash.bat b/ex1.servo-sg90/.vscode/stm32flash.bat
deleted file mode 100644
index 0bcacc9..0000000
--- a/ex1.servo-sg90/.vscode/stm32flash.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-setlocal
-
-set OBJCOPY=%GCC_BIN%\arm-none-eabi-objcopy.exe
-set PORT=%1
-
-echo ==^ Converting ELF to BIN...
-%OBJCOPY% -O binary %ELF% %BIN%
-if errorlevel 1 (
-    echo objcopy failed!
-    exit b 1
-)
-
-echo ==^ Flashing via %PORT% ...
-%FLASH_EXE% -w %BIN% -v -g 0x0 -b 115200 %PORT%
-if errorlevel 1 (
-    echo stm32flash failed!
-    exit b 1
-)
-
-echo ==^ Done.
\ No newline at end of file
diff --git a/ex1.servo-sg90/.vscode/stm32flash.exe b/ex1.servo-sg90/.vscode/stm32flash.exe
deleted file mode 100644
index a50272f..0000000
--- a/ex1.servo-sg90/.vscode/stm32flash.exe
+++ /dev/null
Binary files differ
diff --git a/ex1.servo-sg90/.vscode/tasks.json b/ex1.servo-sg90/.vscode/tasks.json
index c8d0ec6..3079dd6 100644
--- a/ex1.servo-sg90/.vscode/tasks.json
+++ b/ex1.servo-sg90/.vscode/tasks.json
@@ -2,22 +2,16 @@
     "version": "2.0.0",
     "tasks": [
         {
-            "label": "STM32: Flash via ST-Link(SWD)",
+            "label": "STM32: Flash via ST-Link (SWD)",
             "type": "shell",
-            "command": "D:\\Program Files\\ST\\STM32CubeProgrammer\\bin\\STM32_Programmer_CLI.exe",
+            "command": "cube",
             "args": [
-                "-c port=SWD",
-                "-e all",
-                "-w",
-                "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                "0x08000000",
-                "-v",
+                "programmer",
+                "-c", "port=SWD", "freq=4000", "reset=HWrst",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
                 "-rst"
             ],
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -26,26 +20,15 @@
             }
         },
         {
-            "label": "STM32: Flash via stm32flash(UART)",
+            "label": "STM32: Flash via Serial (UART)",
             "type": "shell",
-            "command": "${workspaceFolder}/.vscode/stm32flash.bat",
+            "command": "cube",
             "args": [
-                "${input:comPort}"
+                "programmer",
+                "--connect", "port=${input:comPort}",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf"
             ],
-            "options": {
-                "env": {
-                    "PATH": "${env:PATH}",
-                    "SystemRoot": "${env:SystemRoot}",
-                    "GCC_BIN": "${env:LOCALAPPDATA}\\stm32cube\\bundles\\gnu-tools-for-stm32\\14.3.1+st.2\\bin",
-                    "ELF": "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                    "BIN": "${workspaceFolder}\\build\\Release\\ISKBoard.bin",
-                    "FLASH_EXE": "${workspaceFolder}\\.vscode\\stm32flash.exe"
-                }
-            },
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -62,4 +45,4 @@
             "default": "COM22"
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/ex1.ws2812b/.vscode/stm32flash.bat b/ex1.ws2812b/.vscode/stm32flash.bat
deleted file mode 100644
index 0bcacc9..0000000
--- a/ex1.ws2812b/.vscode/stm32flash.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-setlocal
-
-set OBJCOPY=%GCC_BIN%\arm-none-eabi-objcopy.exe
-set PORT=%1
-
-echo ==^ Converting ELF to BIN...
-%OBJCOPY% -O binary %ELF% %BIN%
-if errorlevel 1 (
-    echo objcopy failed!
-    exit b 1
-)
-
-echo ==^ Flashing via %PORT% ...
-%FLASH_EXE% -w %BIN% -v -g 0x0 -b 115200 %PORT%
-if errorlevel 1 (
-    echo stm32flash failed!
-    exit b 1
-)
-
-echo ==^ Done.
\ No newline at end of file
diff --git a/ex1.ws2812b/.vscode/stm32flash.exe b/ex1.ws2812b/.vscode/stm32flash.exe
deleted file mode 100644
index a50272f..0000000
--- a/ex1.ws2812b/.vscode/stm32flash.exe
+++ /dev/null
Binary files differ
diff --git a/ex1.ws2812b/.vscode/tasks.json b/ex1.ws2812b/.vscode/tasks.json
index c8d0ec6..3079dd6 100644
--- a/ex1.ws2812b/.vscode/tasks.json
+++ b/ex1.ws2812b/.vscode/tasks.json
@@ -2,22 +2,16 @@
     "version": "2.0.0",
     "tasks": [
         {
-            "label": "STM32: Flash via ST-Link(SWD)",
+            "label": "STM32: Flash via ST-Link (SWD)",
             "type": "shell",
-            "command": "D:\\Program Files\\ST\\STM32CubeProgrammer\\bin\\STM32_Programmer_CLI.exe",
+            "command": "cube",
             "args": [
-                "-c port=SWD",
-                "-e all",
-                "-w",
-                "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                "0x08000000",
-                "-v",
+                "programmer",
+                "-c", "port=SWD", "freq=4000", "reset=HWrst",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
                 "-rst"
             ],
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -26,26 +20,15 @@
             }
         },
         {
-            "label": "STM32: Flash via stm32flash(UART)",
+            "label": "STM32: Flash via Serial (UART)",
             "type": "shell",
-            "command": "${workspaceFolder}/.vscode/stm32flash.bat",
+            "command": "cube",
             "args": [
-                "${input:comPort}"
+                "programmer",
+                "--connect", "port=${input:comPort}",
+                "-w", "${workspaceFolder}\\build\\Release\\ISKBoard.elf"
             ],
-            "options": {
-                "env": {
-                    "PATH": "${env:PATH}",
-                    "SystemRoot": "${env:SystemRoot}",
-                    "GCC_BIN": "${env:LOCALAPPDATA}\\stm32cube\\bundles\\gnu-tools-for-stm32\\14.3.1+st.2\\bin",
-                    "ELF": "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
-                    "BIN": "${workspaceFolder}\\build\\Release\\ISKBoard.bin",
-                    "FLASH_EXE": "${workspaceFolder}\\.vscode\\stm32flash.exe"
-                }
-            },
-            "group": {
-                "kind": "build",
-                "isDefault": false
-            },
+            "group": "build",
             "problemMatcher": [],
             "presentation": {
                 "reveal": "always",
@@ -62,4 +45,4 @@
             "default": "COM22"
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/stm32flash/bin/arm-none-eabi-objcopy.exe b/stm32flash/bin/arm-none-eabi-objcopy.exe
new file mode 100644
index 0000000..da2d9c4
--- /dev/null
+++ b/stm32flash/bin/arm-none-eabi-objcopy.exe
Binary files differ
diff --git a/stm32flash/bin/readme.txt b/stm32flash/bin/readme.txt
new file mode 100644
index 0000000..16bdf0a
--- /dev/null
+++ b/stm32flash/bin/readme.txt
@@ -0,0 +1,5 @@
+1. stm32flash.exe 是一个开源命令行工具,通过串口向 STM32 单片机的内置 ISP Bootloader 烧录、读取或校验固件,它只支持 .bin 文件。
+   其下载地址: https://sourceforge.net/projects/stm32flash/files/stm32flash-0.7-binaries.zip/download
+
+2. arm-none-eabi-objcopy.exe 它拷贝自 STM32CubeIDE,是 GNU ARM 嵌入式工具链中的目标文件转换工具,常用于把编译生成的二进制
+   .elf/.hex 文件转换成 .bin 文件,以便烧录到单片机中。 
diff --git a/ex1.auto-light/.vscode/stm32flash.exe b/stm32flash/bin/stm32flash.exe
similarity index 100%
rename from ex1.auto-light/.vscode/stm32flash.exe
rename to stm32flash/bin/stm32flash.exe
Binary files differ
diff --git a/stm32flash/config.ini b/stm32flash/config.ini
new file mode 100644
index 0000000..d4be292
--- /dev/null
+++ b/stm32flash/config.ini
@@ -0,0 +1,4 @@
+[COMMON]
+COM_PORT=COM22
+BAUDRATE=115200
+PRJPATH=..
\ No newline at end of file
diff --git a/stm32flash/stm32flash.bat b/stm32flash/stm32flash.bat
new file mode 100644
index 0000000..81d1997
--- /dev/null
+++ b/stm32flash/stm32flash.bat
@@ -0,0 +1,147 @@
+@echo off
+setlocal EnableDelayedExpansion
+set PATH=%PATH%;bin
+
+rem ====================================================
+rem 配置
+rem ====================================================
+set STM32FLASH=stm32flash.exe
+set ADDRESS=0x8000000
+
+rem ====================================================
+rem 解析 config.ini
+rem ====================================================
+for /f "usebackq tokens=1,2 delims==" %%a in ("config.ini") do (
+    if /i "%%a"=="COM_PORT"   set COM_PORT=%%b
+    if /i "%%a"=="BAUDRATE"   set BAUDRATE=%%b
+    if /i "%%a"=="PRJPATH"    set PRJPATH=%%b
+)
+
+if not defined COM_PORT (
+    echo [ERROR] COM_PORT not found in config.ini
+    pause & exit /b 1
+)
+if not defined BAUDRATE set BAUDRATE=115200
+if not defined PRJPATH set PRJPATH=..
+
+rem 转为绝对路径
+pushd "%PRJPATH%" >nul 2>&1
+if errorlevel 1 (
+    echo [ERROR] PRJPATH "%PRJPATH%" does not exist
+    pause & exit /b 1
+)
+set PRJPATH_ABS=%CD%
+popd
+
+echo Project root: "%PRJPATH_ABS%"
+echo COM port: %COM_PORT% @ %BAUDRATE% bps
+echo.
+
+rem ====================================================
+rem 扫描固件文件
+rem 优先级: MDK-ARM(hex) -> Release -> Debug
+rem ====================================================
+set INDEX=0
+
+echo Scanning for firmware files...
+
+for /r "%PRJPATH_ABS%" %%f in (
+    MDK-ARM\ISKBoard\ISKBoard.hex
+    build\Release\ISKBoard.elf
+    build\Debug\ISKBoard.elf
+) do (
+    if exist "%%f" (
+        set /a INDEX+=1
+        set "FILE_!INDEX!=%%f"
+        echo   !INDEX!^) %%~f
+    )
+)
+
+if %INDEX%==0 (
+    echo [ERROR] No firmware file found under "%PRJPATH_ABS%"
+    echo Expected patterns:
+    echo   - MDK-ARM/ISKBoard/ISKBoard.hex
+    echo   - build/Release/ISKBoard.elf
+    echo   - build/Debug/ISKBoard.elf
+    pause & exit /b 1
+)
+
+echo.
+set /p CHOICE="Select firmware to flash [1-%INDEX%]: "
+
+rem 校验输入
+if "%CHOICE%"=="" (
+    echo [ERROR] No selection made
+    pause & exit /b 1
+)
+if %CHOICE% LSS 1 (
+    echo [ERROR] Invalid selection
+    pause & exit /b 1
+)
+if %CHOICE% GTR %INDEX% (
+    echo [ERROR] Invalid selection
+    pause & exit /b 1
+)
+
+call set SELECTED_FILE=%%FILE_%CHOICE%%%
+echo.
+echo Selected: "%SELECTED_FILE%"
+echo.
+
+rem ====================================================
+rem 确定输出 bin 文件路径(放在源文件同目录下)
+rem ====================================================
+for %%f in ("%SELECTED_FILE%") do set "BIN_FILE=%%~dpnf.bin"
+
+rem ====================================================
+rem 转换 hex/elf -> bin
+rem ====================================================
+echo Converting to binary...
+
+for %%f in ("%SELECTED_FILE%") do set "EXT=%%~xf"
+
+if /i "%EXT%"==".hex" (
+    arm-none-eabi-objcopy.exe -I ihex -O binary "%SELECTED_FILE%" "%BIN_FILE%"
+) else if /i "%EXT%"==".elf" (
+    arm-none-eabi-objcopy.exe -O binary "%SELECTED_FILE%" "%BIN_FILE%"
+) else (
+    echo [ERROR] Unsupported file type: "%EXT%"
+    pause & exit /b 1
+)
+
+if %errorlevel% neq 0 (
+    echo [ERROR] objcopy conversion failed. Error code: %errorlevel%
+    pause & exit /b 1
+)
+
+echo Binary ready: "%BIN_FILE%"
+echo.
+
+rem ====================================================
+rem ISP 模式提示(共用入口)
+rem ====================================================
+:ISP_FLASH
+echo ====================================================
+echo  Serial port: %COM_PORT% @ %BAUDRATE% bps
+echo.
+echo  Please ensure ISKBoard is in ISP mode,
+echo  then press any key to start flashing...
+echo ====================================================
+pause >nul
+
+rem ====================================================
+rem 执行烧录
+rem ====================================================
+echo.
+echo Flashing...
+%STM32FLASH% -b %BAUDRATE% -w "%BIN_FILE%" -v -g %ADDRESS% %COM_PORT%
+
+if %errorlevel% neq 0 (
+    echo [ERROR] Flashing failed. Error code: %errorlevel%
+    pause & exit /b 1
+)
+
+echo.
+echo [SUCCESS] Firmware flashed and verified!
+
+endlocal
\ No newline at end of file

--
Gitblit v1.10.0