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 ") 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)