@echo off
chcp 65001 >nul
cls

echo =================================================
echo         STM32 FLASH and PROTECTION SCRIPT
echo =================================================

:: Путь к STM32_Programmer_CLI
set CLI="D:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe"

:: Файл прошивки
set BIN_PATH="D:\MY_programmers\STM32\Grab\stm32f1-picopwner\dump freezer obd.bin"

:: ============================
echo [STEP 1 / 5] полное стирание...
:: На STM32F1, если RDP установлен в Level 1, его можно снять только через Mass Erase.
:: Mass Erase автоматически сбрасывает RDP в Level 0 (0xAA).
%CLI% -c port=SWD mode=UR freq=1000 reset=HWrst -e all > nul 2>&1
if errorlevel 1 (
    echo Ошибка при выполнении Mass Erase для снятия RDP. Скрипт остановлен.
    
    pause
    exit /b
)
timeout /t 0 >nul

:: Теперь явно устанавливаем RDP в 0xAA (хотя Mass Erase уже должен был это сделать)
:: Добавлено для надежности и единообразия
%CLI% -c port=SWD mode=UR freq=1000 reset=HWrst -ob RDP=0xA5 > nul 2>&1
if errorlevel 1 (
    echo ❌ Ошибка при попытке установки RDP=0xAA. Скрипт остановлен.
    pause
    exit /b
)
timeout /t 0 >nul


:: echo Проверка, снят ли RDP...
:: Захватываем вывод displ в временный файл для парсинга
%CLI% -c port=SWD mode=UR reset=HWrst -ob displ > check_rdp.txt 2>&1
findstr /C:"RDP          : Disabled" check_rdp.txt >nul
if errorlevel 1 (
    echo ❌ RDP НЕ снят. Скрипт остановлен.
    echo.
    echo Содержимое check_rdp.txt для отладки:
    type check_rdp.txt
    del check_rdp.txt
    pause
    exit /b
)
echo RDP успешно снят
del check_rdp.txt

:: ============================
echo.
echo [STEP 2 / 5] Полная очистка Flash памяти...
:: Этот шаг уже был выполнен в начале STEP 1, но оставляю его здесь для ясности логики
:: и на случай, если последующие шаги зависят от свежестертой памяти.
%CLI% -c port=SWD mode=UR reset=HWrst -e all >nul 2>&1
if errorlevel 1 (
    echo ❌ Ошибка при стирании. Скрипт остановлен.
    pause
    exit /b
)
timeout /t 0 >nul

:: ============================
echo.
echo [STEP 3 / 5] Прошивка и верификация файла...
%CLI% -c port=SWD mode=UR reset=HWrst -d %BIN_PATH% 0x08000000 -v >nul 2>&1
if errorlevel 1 (
    echo ❌ Ошибка при прошивке. Скрипт остановлен.
    pause
    exit /b
)
timeout /t 0 >nul

:: ============================
echo.
echo [STEP 4 / 5] Установка RDP Level 1 (0xBB) - защита...
%CLI% -c port=SWD mode=UR reset=HWrst -ob RDP=0xBB >nul 2>&1
if errorlevel 1 (
    echo ❌ Ошибка при установке RDP=0xBB. Скрипт остановлен.
    pause
    exit /b
)
timeout /t 0 >nul

:: ============================
echo.
echo [STEP 5 / 5] Чтение текущих Option Bytes (для проверки)...
:: Захватываем вывод displ во временный файл
%CLI% -c port=SWD mode=UR reset=HWrst -ob displ > temp_ob_display.txt 2>&1

:: Парсим строку с RDP и выводим только ее
for /f "tokens=*" %%a in ('type temp_ob_display.txt ^| findstr /C:"RDP"') do (
    echo %%a
)
:: Удаляем временный файл
del temp_ob_display.txt
timeout /t 0 >nul

:: ============================
echo.
:: Перезапуск службы USB
net stop "USB Serial Converter" >nul 2>&1
echo Соединение с ST-Link разорвано


echo.
echo =================================================
echo ВСЕ ШАГИ ВЫПОЛНЕНЫ. Проверь выше что RDP=Enabled !!!
echo =================================================
pause

в конце у меня stlink переходит в какой то режим (мигает синим светодмодом и повторно не могу запустить скрипт