Add st-link_full.py
Fix st-link_full.py
This commit is contained in:
parent
05621e7150
commit
0c51667ffc
4 changed files with 103 additions and 6 deletions
|
@ -44,8 +44,7 @@ python3 firmware_can.py firmware.hex [адрес устройства]
|
||||||
python3 st-link.py firmware.hex
|
python3 st-link.py firmware.hex
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- ### Не работает!
|
- Если бутлоадер не был прошит и FLASH микрокотроллера полностью стерта
|
||||||
Если бутлоадер не был прошит и FLASH микрокотроллера полностью стерта
|
|
||||||
|
|
||||||
- [Скачать прошивку и бутлоадер в hex формате]
|
- [Скачать прошивку и бутлоадер в hex формате]
|
||||||
ССЫЛКА
|
ССЫЛКА
|
||||||
|
@ -53,7 +52,7 @@ python3 st-link.py firmware.hex
|
||||||
- [Прошить через программатор]
|
- [Прошить через программатор]
|
||||||
```bash
|
```bash
|
||||||
python3 st-link_full.py bootloader.hex firmware.hex
|
python3 st-link_full.py bootloader.hex firmware.hex
|
||||||
``` -->
|
```
|
||||||
|
|
||||||
## Работа по CAN
|
## Работа по CAN
|
||||||
- Установка адреса(если до этого не был установлен адрес, то адрес устройства = 0)
|
- Установка адреса(если до этого не был установлен адрес, то адрес устройства = 0)
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
|
|
||||||
void flash_unlock(){
|
void flash_unlock(){
|
||||||
|
|
||||||
// Check if flash is locked
|
// Check if flash is locked
|
||||||
if(!(FLASH->CR & FLASH_CR_LOCK)) {
|
if(!(FLASH->CR & FLASH_CR_LOCK)) {
|
||||||
return; // Already unlocked
|
return; // Already unlocked
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// clang-format off
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
#include "stm32f446xx.h"
|
#include "stm32f446xx.h"
|
||||||
#include <SimpleFOC.h>
|
#include <SimpleFOC.h>
|
||||||
|
@ -62,7 +62,6 @@ volatile uint32_t ipsr_value = 0;
|
||||||
|
|
||||||
|
|
||||||
void setup(){
|
void setup(){
|
||||||
// Vector table initialization (commented out)
|
|
||||||
SCB->VTOR = (volatile uint32_t)0x08008004;
|
SCB->VTOR = (volatile uint32_t)0x08008004;
|
||||||
|
|
||||||
Serial.setRx(HARDWARE_SERIAL_RX_PIN);
|
Serial.setRx(HARDWARE_SERIAL_RX_PIN);
|
||||||
|
|
100
controller/fw/embed/test/st-link_full.py
Normal file
100
controller/fw/embed/test/st-link_full.py
Normal file
|
@ -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 <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)
|
Loading…
Add table
Add a link
Reference in a new issue