update vscode task.json and add stm32flash tools
4 files modified
7 files deleted
1 files renamed
4 files added
| | |
| | | { |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "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", |
| | |
| | | { |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "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", |
| | |
| | | { |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "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", |
| | |
| | | { |
| | | "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", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "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", |
| New file |
| | |
| | | 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 文件,以便烧录到单片机中。 |
| New file |
| | |
| | | [COMMON] |
| | | COM_PORT=COM22 |
| | | BAUDRATE=115200 |
| | | PRJPATH=.. |
| New file |
| | |
| | | @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 |