2025-06-02 20:02:22 +03:00
|
|
|
|
import subprocess
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
def flash_hex_with_stlink(hex_file_path):
|
|
|
|
|
if not os.path.isfile(hex_file_path):
|
|
|
|
|
print(f"❌ Файл не найден: {hex_file_path}")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
command = [
|
|
|
|
|
"st-flash",
|
|
|
|
|
"--format", "ihex",
|
|
|
|
|
"write",
|
2025-06-02 22:38:56 +03:00
|
|
|
|
hex_file_path
|
2025-06-02 20:02:22 +03:00
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
print(f"⚡️ Прошиваем {hex_file_path} через ST-Link...")
|
|
|
|
|
result = subprocess.run(
|
|
|
|
|
command,
|
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
|
stderr=subprocess.PIPE,
|
|
|
|
|
universal_newlines=True,
|
2025-06-02 22:38:56 +03:00
|
|
|
|
timeout=30
|
2025-06-02 20:02:22 +03:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
print("▬▬▬ STDOUT ▬▬▬")
|
|
|
|
|
print(result.stdout)
|
|
|
|
|
|
|
|
|
|
print("▬▬▬ STDERR ▬▬▬")
|
|
|
|
|
print(result.stderr)
|
|
|
|
|
|
|
|
|
|
if result.returncode == 0:
|
|
|
|
|
print("✅ Прошивка успешно завершена!")
|
2025-06-02 22:38:56 +03:00
|
|
|
|
|
|
|
|
|
# Добавленный блок сброса
|
|
|
|
|
try:
|
|
|
|
|
print("🔄 Выполняем сброс устройства...")
|
|
|
|
|
reset_result = subprocess.run(
|
|
|
|
|
["st-info", "--reset"],
|
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
|
stderr=subprocess.PIPE,
|
|
|
|
|
universal_newlines=True,
|
|
|
|
|
timeout=10
|
|
|
|
|
)
|
|
|
|
|
if reset_result.returncode == 0:
|
|
|
|
|
print("♻️ Устройство успешно сброшено!")
|
|
|
|
|
else:
|
|
|
|
|
print(f"⚠️ Ошибка сброса (код: {reset_result.returncode})")
|
|
|
|
|
print("▬▬▬ STDERR сброса ▬▬▬")
|
|
|
|
|
print(reset_result.stderr)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"⚠️ Ошибка при сбросе: {str(e)}")
|
|
|
|
|
|
2025-06-02 20:02:22 +03:00
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
print(f"❌ Ошибка прошивки (код: {result.returncode})")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
print("❌ st-flash не найден! Установите stlink-tools.")
|
|
|
|
|
return False
|
|
|
|
|
except subprocess.TimeoutExpired:
|
|
|
|
|
print("❌ Таймаут операции! Проверьте подключение ST-Link.")
|
|
|
|
|
return False
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"❌ Неизвестная ошибка: {str(e)}")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
if len(sys.argv) != 2:
|
|
|
|
|
print("Использование: python stlink_flash.py <firmware.hex>")
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
if flash_hex_with_stlink(sys.argv[1]):
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
else:
|
2025-06-02 22:38:56 +03:00
|
|
|
|
sys.exit(1)
|