Купил китайский клон Maple Mini (не собираюсь использовать Maple IDE, просто удобный форм-фактор заводской платы с STM32F103). И зашил с помощью dfu-util (на микроконтроллере предустановлен USB DFU bootloader) по ошибке ELF-файл вместо BIN-файла. Судя по всему в загрузчике нет проверки на то, что память кончилась и пора бы прекратить писать, и он перезаписал всё что смог, пока, вероятно, не дошёл до собственного кода и утилита прошивки вылетела с ошибкой.
Это не беда подумал я - исходники загрузчика есть на официальном сайте, а у меня есть программатор ST-Link V2, однако всё оказалось не так просто. Программатор видит чип и я могу свободно писать в него свою прошивку, однако она не запускается (пробовал писать официальный bootloader, а также демку ChibiOS для данной платы). Если подключиться в режиме отладчика, то видно, что сразу после старта происходит unhandled expection. Если записывать те же прошивки тем же программатором на другие платы с таким же МК (но который я не перезаписывал с помощью dfu-util, а только программировал программатором), то всё работает.
Получается, что DFU USB Bootloader перед своей смертью перезаписал какой-то участок энергонезависимой памяти, который не перезаписывается при обычной прошивке и теперь мешает запуску любой прошивки.
Собственно вопрос - как починить? Могу скопировать нужный кусок памяти с рабочего МК, но надо знать адрес, который пострадал.
UPD: Писал с помощью GDB регистры периферии. Вручную разблокировал запись Option Bytes (ну по идее же ведь кроме них и флеша bootloader ничего испортить не мог) и стёр их, после этого программатор стал писать, что у МК 0 КБ флеша, а GDB отказывался работать с периферией. Скачал официальную утилиту для работы с StLink и запустил на виртуальной машине с Windows XP - при подключении к девайсу она ругнулась, что включена защита от чтения. Я зашёл в настройки Option Bytes и выключил защиту, записал. Теперь и официальная утилита, и st-flash вновь видят 128 КБ флеша, как положенно, однако один фиг прошивка не стартует.
Подключился опять GDB. Мы попадаем в Reset_Handler, он немного инициализирует ОЗУ (ну там запись значений по умолчанию, функция LoopCopyDataInit), а потом мы внезапно возвращаемся в Reset_Handler. Грешу на Watchdog, однако он в режиме Software. Если снять галочку в настройках Option Bytes в утилите для прошивке, то он становится Hardware, а прошивка вообще не выходит из Reset_Handler.
UPD2: Это была проблема в бутлоадере, который я скомпилировал. А когда я загрузил демку от ChibiOS она заработала. Так что запись Option Bytes через официальную утилиту помогла. Проблема решена.