@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
|