100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
import subprocess
|
||
import os
|
||
import sys
|
||
import time
|
||
|
||
def flash_hex_with_stlink(hex_file_path, component_name):
|
||
if not os.path.isfile(hex_file_path):
|
||
print(f"❌ Файл {component_name} не найден: {hex_file_path}")
|
||
return False
|
||
|
||
command = [
|
||
"st-flash",
|
||
"--format", "ihex",
|
||
"write",
|
||
hex_file_path
|
||
]
|
||
|
||
try:
|
||
print(f"⚡️ Прошиваем {component_name} ({hex_file_path}) через ST-Link...")
|
||
result = subprocess.run(
|
||
command,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
universal_newlines=True,
|
||
timeout=30
|
||
)
|
||
|
||
print("▬▬▬ STDOUT ▬▬▬")
|
||
print(result.stdout)
|
||
|
||
print("▬▬▬ STDERR ▬▬▬")
|
||
print(result.stderr)
|
||
|
||
if result.returncode == 0:
|
||
print(f"✅ {component_name} успешно прошит!")
|
||
return True
|
||
else:
|
||
print(f"❌ Ошибка прошивки {component_name} (код: {result.returncode})")
|
||
return False
|
||
|
||
except FileNotFoundError:
|
||
print("❌ st-flash не найден! Установите stlink-tools.")
|
||
return False
|
||
except subprocess.TimeoutExpired:
|
||
print(f"❌ Таймаут операции при прошивке {component_name}! Проверьте подключение ST-Link.")
|
||
return False
|
||
except Exception as e:
|
||
print(f"❌ Неизвестная ошибка при прошивке {component_name}: {str(e)}")
|
||
return False
|
||
|
||
def reset_device():
|
||
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("♻️ Устройство успешно сброшено!")
|
||
return True
|
||
else:
|
||
print(f"⚠️ Ошибка при сбросе (код: {reset_result.returncode})")
|
||
print("▬▬▬ STDERR сброса ▬▬▬")
|
||
print(reset_result.stderr)
|
||
return False
|
||
except Exception as e:
|
||
print(f"⚠️ Ошибка при сбросе: {str(e)}")
|
||
return False
|
||
|
||
if __name__ == "__main__":
|
||
if len(sys.argv) != 3:
|
||
print("Использование: python stlink_flash.py <bootloader.hex> <application.hex>")
|
||
print("Пример: python stlink_flash.py bootloader.hex firmware.hex")
|
||
sys.exit(1)
|
||
|
||
bootloader_path = sys.argv[1]
|
||
app_path = sys.argv[2]
|
||
|
||
# Прошиваем сначала бутлоадер
|
||
if not flash_hex_with_stlink(bootloader_path, "Bootloader"):
|
||
print("\n💥 Ошибка прошивки бутлоадера!")
|
||
sys.exit(1)
|
||
|
||
# Сбрасываем устройство после прошивки бутлоадера
|
||
reset_device()
|
||
time.sleep(1) # Короткая пауза
|
||
|
||
# Прошиваем основное приложение
|
||
if not flash_hex_with_stlink(app_path, "Application"):
|
||
print("\n💥 Ошибка прошивки основного приложения!")
|
||
sys.exit(1)
|
||
|
||
# Финальный сброс устройства
|
||
reset_device()
|
||
|
||
print("\n🎉 Все компоненты успешно прошиты!")
|
||
sys.exit(0)
|