Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
STM32 - входим в bootloader по кнопке. / Схемотехника / Сообщество EasyElectronics.ru

STM32 - входим в bootloader по кнопке.

Лирическое отступление.

Года 4 назад начались у нас продажи мелких партий устройств, основанных на STM32. Так как на само устройство мы, в виду миниатюрности устройства, не ставили разъём под программирование, то заливать прошивку был решено используя родной bootloader. Но тут опять возникла проблема — как в bootloader входить. Замыкать ножку BOOT при помощи джампера показалось плохой идеей. И тогда была поставлена задача — контроллер должен входить в bootloader по нажатию 1й кнопки.


Отмазки

Статья про небольшое схемотехническое решение, сделанное по принципу «собрать из того что уже есть». Так что строго прошу не судить. Ну к сути.

Суть
Как уже указал выше, сделать надо было всё максимально дёшево, и и того что можно достать в ближайших радиодеталях. И тогда родилась вот эта схема:

Немножко о том, как это работает:

Контроллер после подачи питания (после нажатия RESET) первым делом смотрит на ножки BOOT, для того что бы понять, откуда ему грузится. Делает он это довольно быстро, и уже после того как решение о том, откуда грузится принято — состояние ножек BOOT может быть абсолютно любое. Значит из этого и будем исходить.
Для перехода контроллера в bootloader надо что бы после нажатия RESET, BOOT1 был равен «0» а BOOT0 равен «1». Соответственно на плате замыкаем BOOT1 на землю, а BOOT0 и RESET подключаем к схеме.
После нажатия на кнопку происходят 2 вещи:
  1. Открывается транзистор Q1, тем самым замыкая RESET на землю, и перезагружая контроллер.
  2. Через диод D1 заряжается конденсатор C9.
Как только вы отпускаете кнопку (держать не надо, всё срабатывает моментально), контроллер начинает загружаться, а конденсатор C9 медленно разряжаться через резисторы R7 и R9, при этом поддерживая логический уровень «1» на ножке BOOT0. Диод D1 не даёт конденсатору открыть своим зарядом транзистор Q1. Того времени, пока разряжается конденсатор с запасом хватает, что бы контроллер принял решение о переходе в bootloader.
Схема используется уже несколько лет и ни разу не подводила.

Достоинства и недостатки

Достоинством схемы является то, что теперь мелкие партии девайсов можно отдать прошивать любому человеку, который умеет кликать мышкой. Ибо запустив перед ним DfuSeDemo, и сказав «подключи USB к девайсу, нажми на нём кнопку, нажми кнопку „прошить“ в программе DfuSeDemo» можно оставить его работать без присмотра. Никаких теряющихся джамперов и так далее. А так же можно удалённо помочь заказчику, в том случае если настал «магический пипец» и ничего не работает, попросив его только подключить девайс к компьютеру и нажать на кнопку. Дальше прошивку можно сделать по удалённому доступу.

Явным недостатком является то, что выходить из bootloader'а эта кнопка не позволяет. Так что после прошивки надо выключить и включить девайс (вынуть и вставить USB кабель). Но с этим мы решили смирится.

Ещё отмазки

Есть варианты решений, что бы кнопка работала и как выход из bootloader'а, например добавив логический элемент, или как подсказал уважаемый SiberK , поставить резюк после диода, тогда время нажатия кнопки будет влиять на то, просто ли ребутнётся МК или перепрыгнет в загрузчик. Но нам это было не надо.
Так что если надо — пользуйтесь. И удачи в ваших разработках.
  • +5
  • 22 сентября 2016, 17:20
  • zloiMOZG

Комментарии (25)

RSS свернуть / развернуть
А если последовательно с диодом поставить резистор, то можно организовать «кнопку двойного действия»: короткое нажатие — простой сброс (поскольку конденсатор не успеет зарядиться до уровня единицы), длинное нажатие и отпускание кнопки вызовет сброс с выходом в бутлоадер. Как-то так.
+3
А вот это отличная идея. Как я сразу не подумал:)
0
Есть варианты решений, что бы кнопка работала и как выход из bootloader'а, например добавив логический элемент.
А как выйти из бутлоадера по кнопке?
0
  • avatar
  • Vga
  • 22 сентября 2016, 19:38
Нажали на кнопку — открыли транзюк, логика сказала «1» на BOOT. Ещё раз, тоже самое но логика сказала «0». Транзюк в любом случае открываем что бы резет сделать. D-триггер в режиме делителя частоты…
0
Другими словами, выход ресетом.
0
  • avatar
  • Vga
  • 22 сентября 2016, 23:07
Ну типа да :)
А чисто ради интереса, а из бутлоадера стандартного на STM32 ещё как то можно выйти?
0
А чисто ради интереса, а из бутлоадера стандартного на STM32 ещё как то можно выйти?
Вот именно это меня и интересовало.
0
  • avatar
  • Vga
  • 23 сентября 2016, 09:51
Можно запустить выполнение с указанного адреса.
0
Командой бутлоадеру?
0
  • avatar
  • Vga
  • 23 сентября 2016, 21:55
Да, я так всегда запускаю код из ram.
0
когда я делал bootloader на tms320f28335 то, по завершению прошивки и проверки всех CRC, делал классический jumb на нужный адрес, эмитируя нормальный boot, и таким образом загружая новую прошивку.
0
Исходником лодыля поделитель? Занимаюсь тоже TMSами(приводом), а как написать лодырь пока не успеваю разобраться.
0
не получится, код был на работе, и я не вынашивал мысль его с работы красть. так что разве что по памяти смогу советы дать. кстати я вел дискусию про BL на electronix.ru/ в разделе «Сигнальные процессоры и их программирование — DSP» и там человек (doom13) делился своим кодом под этот проц, там сможете найти. Вот тут electronix.ru/forum/index.php?showtopic=120294&hl= или вот тут electronix.ru/forum/index.php?showtopic=121198 — почитаете, много узнаете.
0
Кстати, вот сегодня мне попалось на глаза, думаю что Вам пригодится.
github.com/rafaelrmmartins/tms320f28335monitor/
PS: Жаль я раньше не встретит сей линк. Свой лоадер не пришлось б писать
0
Это то прекрасно. А что делать ДО того как была залита какая либо прошивка в МК? Потом то понятно, что можно в бутлоадер падать, когда уже зашил что либо своё…
0
Встроенный лодырь (на стадии производства) который вызывается конфигурацией ножек boot, распостранённыя вещь помоему.
0
Так эта схема как раз и конфигурирует ножки, что бы упасть во вшитый на заводу бутлоадер.
Просто в стандартный бутлоадер можно прыгнуть из своей программы. Но когда у тебя контроллер чист, сделать это сложновато…
0
заводской БЛ (0й) прыгает в дефотлный адрес, а там будет ваш проприетарный БЛ (1й). и он прыгает в entry point, который вы можете назначить на этапе компилирования проекта. вот и все. предварительно вам нужно зафиксировать свой flash-map и строго его придерживаться.
+1
Привет. Предлагаю схему для сброса/перехода в boot по одной кнопке: короткое нажатие на кнопку (менее секунды) вызывает сброс, длительное нажатие (более 2 секунд примерно) с последующим отпусканием переводит в boot. Естественно также, что при подаче питания вырабатывается лишь сброс.
0
У себя сделал так:

Протестировал на STM32F072C8 с USB DFU загрузчиком — работает отлично.
+1
А не проще вызывать System Bootloader из своей программы если нужно?
Или нужно, что бы аппаратно запускался?
0
  • avatar
  • x893
  • 04 октября 2016, 14:58
Своя программа может отсутствовать или не работать.
0
все-таки я бы поставил на плату slider-switch… Столько внешних компонентов ради входа в загрузчик!
0
Иногда бывает, что под него места особо нету. Рассыпуха ща очень мелкая, а движковые переключатели довольно крупные.
0
да явно не крупнее, чем горсть рассыпухи + разводка, ну и всё ещё и запаять надо…
не, решение по-своему красивое, но немного напоминает конструкции, где катится шарик и включает одно, другое, потом импульс передаётся уже электрический, потом идёт химическая реакция, потом тарелочка на весах опускается, свечка пережигает верёвку… короче, загорается лампочка)
возможно, необходимость в однокнопочнопожимательном решении и была (нельзя корпус дырявить под слайдер или разбирать заказчиком), но из псто этого не видно)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.