Hi,
Anfang des Jahres habe ich für einen Kunden sowas für STM32 MCU
umgesetzt.
Das Embedded-System hat einen Mastercontroller, der per USB VCP an einen
Host-PC angeschlossen wird.
Intern kommunizieren die STM32 über einen Halbduplex-RS485-Bus.
Anhand der vom Host gesendeten Adresse erkennt der Master, wo das Ziel
eines Datenpakets liegt.
Ist er selber der Adressat, wird das Paket intern verarbeitet.
Ist ein Slave das Ziel, wird das Paket auf den RS485-Bus umgesetzt.
Da ein Firmware-Update nur unter kontrollierten Bedingungen in der
Wartungshalle statt findet, war hier ein sehr einfaches Protokoll
umsetzbar:
Es wird vom Host zunächst mitgeteilt, welche MCU der Empfänger ist.
Ist es der Mastercontroller, dann findet während des Updates nur eine
Kommunikation auf dem USB VCP statt. Die Slaves bekommen das ggf.
garnicht mit.
Soll ein Slave eine neue Firmware bekommen, so wird ein "Initialisiere
Update für Slave x" Kommando geschickt.
- der angesprochene Slave wartet dann auf neue Firmware
- die übrigen Slaves gehen in einen Schlafmodus
- der Master fungiert nur als Bridge zwischen USB und RS485
Nach dem Update wird das System neu gestartet.
Der Vorteil an diesem Verfahren ist, dass während des Updates ein
anderes Protokoll, auch mit anderer Baudrate, auf dem RS485-Bus gefahren
werden kann, als während des Normalbetriebs.
Zur (Übertragungs-)Sicherheit / Fehlererkennung:
- Bootloaderansprung über Passwort
- RS485 mit Parity
- Prüfsummen im Update-Paket
- Festspeicherprüfsummen
Insbesondere letztere sorgen für Rücksprung in den geschützten
Bootloader, wenn beim Systemstart Fehler erkannt werden.
Grüße,
marcus