![](https://habrastorage.org/webt/9h/2q/ut/9h2qutchzbdp3yruumnhs2qwgaq.jpeg)
Здравствуйте! Меня зовут Дмитрий Руднев. В этой публикации я поделюсь своим горьким опытом.
В современной разработке широко используются микроконтроллеры STM32. Они обладают неплохим соотношением цена/производительность, вокруг них сложилась развитая «экосистема». Для прошивки этих микроконтроллеров и внутрисхемной отладки обычно используют интерфейс Serial Wire (SWD).
В процессе отладки бывает всякое. Не беда, если STM32 после прошивки ведёт себя неадекватно. Обидно, если при этом к нему не удаётся подключиться.
На этом месте не надо впадать в отчаяние, т.к. «убить насмерть» STM32 в процессе программирования непросто, и его работоспособность можно восстановить штатными средствами.
После аппаратного сброса микроконтроллер первым делом запускает системный загрузчик. Системный загрузчик проверяет состояние входов BOOT0 и BOOT1 и по их состоянию определяет режим дальнейшей загрузки. В зависимости от состояния BOOT0 подключиться к микроконтроллеру можно, как минимум, двумя разными способами.
Connect Under Reset
Если на входе BOOT0 обнаружен низкий уровень, системный загрузчик передаёт управление пользовательской программе, находящейся в FLASH-памяти. Если при этом к интерфейсу SWD подключен в режиме «Connect Under Reset» внутрисхемный отладчик, ему удаётся управление перехватить.
Рассмотрим, как это сделать с помощью программы STM32 ST-LINK Utility и программатора ST-LINK/V2-1. Программа была получена с официального сайта ST. Программатор пришёл в составе платы NUCLEO-F446ZE.
Запускаем программу, входим в «Settings»:
![](https://habrastorage.org/webt/bn/4i/sg/bn4isgic61iblgulgw3trkpn_fw.png)
В окне «Settings» выбираем режим «Connect Under Reset»:
![](https://habrastorage.org/webt/pn/ik/hn/pnikhn6yov2bflkzppabsgrafys.png)
Подключаемся к нашему «кирпичику»:
![](https://habrastorage.org/webt/wm/pi/8g/wmpi8ghtwrdeqxc1eukg9x5h-2c.png)
Производим очистку памяти программ:
![](https://habrastorage.org/webt/rm/eg/3p/rmeg3p5c-z4vbg2em93o83assly.png)
Подключение по UART1
Очень часто для прошивки STM32 применяются недорогие китайские клоны ST-LINK/V2. Без аппаратной переделки режим «Connect Under Reset» они не поддерживают. В этом случае стоит попытаться очистить память программ, подключившись к микроконтроллеру по UART.
Если подать на вход BOOT0 высокий уровень, то можно подключиться к микроконтроллеру через интерфейс UART1 с использованием программы Flash Loader Demonstrator. Программу можно получить с официального сайта ST. Преобразователь USB–UART подойдёт любой.
Запускаем программу. Выбираем COM-порт, к которому подключен преобразователь USB–UART:
![](https://habrastorage.org/webt/vz/s7/ux/vzs7ux78lpcoxn4du4xeq3jpwz4.png)
Убеждаемся, что соединение установлено:
![](https://habrastorage.org/webt/kp/bc/fl/kpbcfl8a1c9ubucsjgb1nt8_qai.png)
На следующем экране программа показывает области памяти микроконтроллера:
![](https://habrastorage.org/webt/i1/9q/us/i19quscfhvkom0f8mfpb17xdm5a.png)
На следующем экране мы должны выбрать действие. Выбираем Erase – All:
![](https://habrastorage.org/webt/ym/_3/31/ym_331bad60o5adirlpuv1jrs0y.png)
Очистка памяти программ успешно завершена:
![](https://habrastorage.org/webt/4b/nl/72/4bnl728z4grf3oewfw-4ttuw6ny.png)
На этом месте надо вернуть на вход BOOT0 низкий уровень.
От автора
Любое несчастье, которое происходит с Вами, с кем-то другим уже происходило. Всё, что описано в публикации, происходило со мной и моим оборудованием.
Первая часть публикации повествует о том, как я в самом начале самоизоляции «закирпичил» новенькую оригинальную NUCLEO-F446ZE.
Это не стало для меня ударом, т.к. я уже знал, что делать. Наоборот, в процессе восстановления работоспособности платы я даже получил какое-то удовольствие от работы.
Предыдущий опыт был более трагичным. Я использовал совсем бюджетную плату в связке с очень недорогим клоном ST-LINK/V2. В один прекрасный миг, связь с платой по SWD пропала.
Результаты поиска в сети убедили меня использовать режим «Connect Under Reset». Ничтоже сумняшеся, я подключил вывод NRST микроконтроллера к выводу «Reset» программатора. Не знал я тогда, что этот вывод используется только при работе с STM8.
Сигнал сброса не проходил. Связь по интерфейсу SWD не восстанавливалась. Игры с кнопкой «Reset» на плате результата не давали. В самый раз было начинать читать мануалы.
И метод RTFM сработал! Из раздела «2.3.10 Boot modes» datasheet DS5792 rev13 я узнал про загрузку через UART1. Затем я нашёл информацию о Flash Loader Demonstrator. Восстановить работоспособность STM32F103RET6 с этими инструментами было уже несложно, что и вылилось в 113 слов и пять картинок второй части публикации…
Буду рад, если мой опыт будет кому-то полезен!
![](https://habrastorage.org/webt/ou/g5/kh/oug5kh6sjydt9llengsiebnp40w.png)