guowenxue
4 days ago 53de825c4c4d8325c02341177f62ab84897eb5ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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