diff --git a/controller/fw/embed/README.md b/controller/fw/embed/README.md index 2cdd810..8606846 100644 --- a/controller/fw/embed/README.md +++ b/controller/fw/embed/README.md @@ -44,8 +44,7 @@ python3 firmware_can.py firmware.hex [адрес устройства] python3 st-link.py firmware.hex ``` - +``` ## Работа по CAN - Установка адреса(если до этого не был установлен адрес, то адрес устройства = 0) diff --git a/controller/fw/embed/src/flash.cpp b/controller/fw/embed/src/flash.cpp index 03ce882..1e68b28 100644 --- a/controller/fw/embed/src/flash.cpp +++ b/controller/fw/embed/src/flash.cpp @@ -4,7 +4,6 @@ void flash_unlock(){ - // Check if flash is locked if(!(FLASH->CR & FLASH_CR_LOCK)) { return; // Already unlocked diff --git a/controller/fw/embed/src/main.cpp b/controller/fw/embed/src/main.cpp index 1429f78..5ed9b3a 100644 --- a/controller/fw/embed/src/main.cpp +++ b/controller/fw/embed/src/main.cpp @@ -1,4 +1,4 @@ - // clang-format off + #include "Arduino.h" #include "stm32f446xx.h" #include @@ -62,7 +62,6 @@ volatile uint32_t ipsr_value = 0; void setup(){ - // Vector table initialization (commented out) SCB->VTOR = (volatile uint32_t)0x08008004; Serial.setRx(HARDWARE_SERIAL_RX_PIN); diff --git a/controller/fw/embed/test/st-link_full.py b/controller/fw/embed/test/st-link_full.py new file mode 100644 index 0000000..7652e4f --- /dev/null +++ b/controller/fw/embed/test/st-link_full.py @@ -0,0 +1,100 @@ +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)