@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