Прошивка чем грузится - программатором или бутлоадером? Я делал
так: бутлоадер (фиксированный) с фиксированной своей CRC, при
каждом сбросе вначале проверяет сам себя. Далее, читает длину и CRC
рабочей программы из EEPROM, подсчитывает CRC, и если совпало -
передаёт управление. Если выбран режим обновления, то Бутлоадер (по
СОМ-порту) вначале из шапки прошивки читает её длину и CRC, затем
прошивает МК, подсчитывая CRC. Если в конце CRC совпали, то новая
длина и новая CRC переписываются в EEPROM поверх старых значений. Если нет, то после сброса Бутлоадер определит несовпадение и начнет ругаться, что рабочая программа повреждена.