Здравствуйте! Меня зовут Дмитрий Руднев. В этой публикации я поделюсь своим горьким опытом.
В современной разработке широко используются микроконтроллеры 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»:
В окне «Settings» выбираем режим «Connect Under Reset»:
Подключаемся к нашему «кирпичику»:
Производим очистку памяти программ:
Подключение по UART1
Очень часто для прошивки STM32 применяются недорогие китайские клоны ST-LINK/V2. Без аппаратной переделки режим «Connect Under Reset» они не поддерживают. В этом случае стоит попытаться очистить память программ, подключившись к микроконтроллеру по UART.
Если подать на вход BOOT0 высокий уровень, то можно подключиться к микроконтроллеру через интерфейс UART1 с использованием программы Flash Loader Demonstrator. Программу можно получить с официального сайта ST. Преобразователь USB–UART подойдёт любой.
Запускаем программу. Выбираем COM-порт, к которому подключен преобразователь USB–UART:
Убеждаемся, что соединение установлено:
На следующем экране программа показывает области памяти микроконтроллера:
На следующем экране мы должны выбрать действие. Выбираем Erase – All:
Очистка памяти программ успешно завершена:
На этом месте надо вернуть на вход 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 слов и пять картинок второй части публикации…
Буду рад, если мой опыт будет кому-то полезен!
Sap_ru
Если честно, то вся статья это «делайте по инструкции» и китайские программаторы не имеют сигнала Reset.
Ясен перец, что если у вас виснет контроллер, то подключаться нужно только при сигнале сброса. Но если вы фьюзы правильно пропишете, то и это не поможет.
EddyEm
У STM32 нет «фьюзов». Его вообще невозможно окирпичить! Даже если у автора руки совсем из задницы и он залочит прошивку, все равно можно перешить МК.
Чтобы убить возможность прошивки STM32, нужно убить одну из ножек PA14/PA15 или PA9/PA10 (чтобы нельзя было прошить через UART бутлоадер), PA11/PA12 (чтобы нельзя было прошить через DFU) и PB6/PB7 (чтобы нельзя было через I2C прошить); ну и, само-собой, SWD/JTAG.
Лично я предпочитаю работать через DFU с теми МК, у которых он есть. Если же нет, то либо бутлоадер на UART1, либо SWD (но SWD крайне редко, т.к. случаи, когда используемые им ноги ни для чего не нужны — чуть ли не единичны). В Makefile я добавляю минимум три цели для прошивки: DFU, бутлоадер и SWD.
P.S. А статья сама по себе яйца выеденного не стоит, т.к. содержит общеизвестную информацию. Это как написать статью «почему Солнце всходит на востоке».
ZiggiPop
Вот зашел сюда прочитать именно это! Сталкивался с контроллерами, на которых сожжено было буквально половина ног и прошивка была криво залита, и даже при этом его удавалось перепрошить и поднять.
Sap_ru
Потому, что сейчас софт пишут сплошь мамкины ардуинщики, которые ни даташитов не читали, ни как защита работает не понимают. Level 2 protection включаете, который есть на ВСЕХ STM32 кроме STM32F1xx, и у вас отключается JTAG/SWD на пару с встроенным бутлоадером и чего вы будете потом с таким контроллером делать? Снять защиту может только код из прошивки.
ZiggiPop
Это «окирпичивание» соблюдается при осознанном действии, не знаю, что необходимо сделать, чтобы случайно включить Level 2 protection.
Sap_ru
Элементарно. Случайно ошиблись при установке Options. Или специально ставите (любой нормальный софт должен проверять/ставить защиту программно, чтобы не украли прошивку), а в прошивочке косячок и она окирпичивается. Или софт при массовом производстве при программировании случайно поставили, когда защиту ставили (вы же защищаете прошивку?).
Sap_ru
.
spballiance
На f103 вроде нет
nixtonixto
Level 2 снять невозможно ни снаружи чипа, ни изнутри. Это необратимая операция.
Sap_ru
Отлично снимается стираем чипа из прошивки.
nixtonixto
Read protection Level 2
When RDP level 2 is activated, all protections provided in Level1 are active and the chip is fully protected. The RDP option byte and all other option bytes are frozen and can no longer be modified. The JTAG, SWV (single-wire viewer), ETM, and boundary scan are disabled.
When booting from Flash memory, the memory content is accessible to user code. However, booting from SRAM or from system memory bootloader is no more possible.
This protection is irreversible (JTAG fuse), so it’s impossible to go back to protection levels 1 or 0.
Работает только самопрограммирование, но Option бит не снимается.
Sap_ru
Да, действительно. Я, просто, совершенно точно снимал level 2 из прошивки на каком-то из STM32. Но это могло быть что-то из старых STM32F2xx или STM32Fxx, которые уже outdated.
Sap_ru
LOL! Даже не знаю, что ответить… У вас STM32 начинается и заканчивается на STM32F1xx? :)
Ключевые слова — Level 2 protection. Это есть у ВСЕХ STM32 кроме STM32F1xx.
Берёте STM32L0xx, STM32L1xx, STM32F2xx, STM32F3xx и т.д., включаете Level 2 protection в RDP и у вас отключаются SWD/JTAG и System boot memоry — как будете раскирпичивать?
vassav
Элементарно, подключаешься по SWD и делаешь сброс — и чип прошивается
JohnnySmart
Попробуйте на своём контроллере, расскажите всем о ваших успехах
Sap_ru
SWD отключается при Level 2.
N1X
Была статья в сети с исследованием. Вскрываем чип, ильтрафиолетом светим кристалл :) очень "простой" метод.
screwer
Инфильтраолетом. От слова infiltration.
Sap_ru
Во-первых, некоторые чипы имеют защиту от полировки. Так себе защита, но процесс получения работоспособного шлифованного чипа усложняет. Тогда уже проще электронным микроскопом считать прошивку или поменять биты.
И при облучении много другого потрётся.
bat654321
Отучаемся говорить за всех. Это у вашего допотопного f103 нет фьюзов.
А у G0xx их фигова туча. И окирпичить его как нефиг делать
Sap_ru
Собственно, только у f1xx и нет.
Polaris99
Read protection Level 2 — не слышали? И никакие методы восстановления уже не работают, ни «авторские», ни иные. Сам сталкивался по недосмотру.