Загрузчик с USB доведен до ума. Сейчас он работает так:
- При запуске контроллера он проверяет, не подключен ли USB-разъём к компьютеру. Для этого не используется никаких дополнительных пинов контроллера, кроме стандартных USBDP и USBDM. Если компьютер подключен, устройство определяется компом, как Mass Storage Device, и выглядит, как подключенная флешка или кардридер. Никаких драйверов устанавливать не нужно. Зарядное устройство не считается за компьютер, с ним девайс работает в обычном режиме. Можно даже Power bank в поле подключать, и прям с ним бегать
- Если компьютер не подключен, устройство проверяет файл flash.bin с прошивкой на карте памяти. Если его содержимое отличается от того, чем мы прошивались в предыдущий раз, то контроллер перепрошивается. Если рядом лежит файл flash.ly, то из него считывается ly-хэш, который используется для проверки целостности прошивки. Если файла нет, то flash.bin считается по-умолчанию целостным. После перепрошивки контроллер автоматически загружает основную программу.
- Если flash.bin не обновлялся, контроллер просто загружает основную программу
Таким образом, чтобы держать систему up-to-date, нужно забросить на карточку самую новую прошивку flash.bin. Ничего переименовывать и проверять не нужно, этот файл так и будет лежать на карте.
В процессе перепрошивки и при работе в качестве кардридера контроллер прижимает к земле все не используемые в процессе пины, чтобы избежать z-состояния и наводок. Это позволяет подключать полевики затворами прямо к контроллеру без защитных резисторов затвор-земля. Это существенно экономит место на плате, поскольку полевиков обычно не меньше пяти.
Также, загрузчик по UART1 подробно рассказывает о своём состоянии, если нужно диагностировать проблемы (это можно отключить). Параметры 8N1, 921600 бит/с. Такую скорость пережует китайский USB<->UART переходник на поддельном FT232RL.
Загрузчик никак не привязан к конкретной прошивке и лазертагу вообще, и прошьет всё, что влезет в память. Проверка размера прошивки, само собой, присутствует. Сам себя бутлоадер не испортит
Исходный код выложу в ближайшее время, поскольку никакого секрета здесь нет, а другим людям может пригодиться. Написан с STM HAL, который портируется куда лучше, чем stdperiph. Единственное, что хочется улучшить - это прикрутить cmake, чтобы собиралось без Eclipse + ARM plugin.