Извлечение .hex из Arduino

У меня есть Arduino Due, он был запрограммирован IDE Arduino, чтобы сократить время, я потерял доступ к файлу исходного скетча (.ino), его невозможно восстановить, несмотря ни на что.

Я знаю, что в 8-разрядных микроконтроллерах я могу прочитать файл .hex из флэш-памяти, я уже сделал это с микроконтроллерами PIC и AVR с их программными утилитами.

Мой вопрос: Могу ли я использовать утилиту программатора на ПК с Windows, чтобы извлечь шестнадцатеричный файл для перепрограммирования другого Arduino, связанного с ним? Если да, пожалуйста, помогите мне. Я читал о утилите Bossac, она выглядит многообещающе, но у меня вообще нет опыта в области микроконтроллеров ARM.

опять же: меня НЕ интересует C или ассемблерный код, мне просто нужен .hex-файл.

, 👍2

Обсуждение

вы можете просто прочитать шестнадцатеричный код с помощью avrdude с параметром "- U flash:r:имя файла"., @Sim Son

Нет, вы не можете, avrdude предназначен для 8-разрядных микроконтроллеров Atmel, это 32-разрядный микроконтроллер ARM, USBASB не будет работать., @Abd-AlRahman Muhammad

Ты прав, я виноват!, @Sim Son

Не волнуйтесь вообще, я попробую сейчас некоторые методы и сообщу, если что-нибудь удастся., @Abd-AlRahman Muhammad

Я уверен, что вы можете сделать это с помощью интерфейса JTAG. Хотя понятия не имею как., @Majenko


1 ответ


Лучший ответ:

1

Вы можете использовать JTAG и, вероятно, должны это сделать. Но это также можно сделать с помощью bossac, если вы будете очень осторожны. Если вы этого не сделаете, вы в конечном итоге сотрете свою флэш на исходной плате.

Использование bossac

Возможно, это было бы не предпочтительнее JTAG, потому что, вероятно, его легче испортить (см. Предупреждения ниже), но это можно сделать. Я могу добавить немного о программировании JTAG позже, и если я это сделаю, то по этой причине это может быть выше этого раздела. Главное преимущество здесь как раз в том, что вам не нужен программист JTAG. Одно предостережение состоит в том, что ваш существующий скетч, или, скорее, образ скетча, которое было записано на то, что я называю "исходной платой", должно функционировать достаточно хорошо, чтобы он мог сотрудничать при размещении обратно в загрузчик ПЗУ. Я полностью ожидаю, что это не проблема ни для вас, ни для любого обычного скетча Arduino, который был сожжен на плате.

ПРЕДУПРЕЖДЕНИЯ

  • Ни при каких обстоятельствах вы не хотите подключаться к программному порту вашей материнской платы со скоростью 1200 бод.
    Это приведет к стиранию вашей платы, и на этом все закончится.

  • На рисунке ниже вы будете подключаться к собственному USB-порту на 1200, а НЕ к программному порту.
    Подключайте к компьютеру одновременно только один порт, чтобы исключить возможность выбора неправильного.

  • Отрабатывайте всю эту процедуру с платой, о которой вам в первую очередь наплевать.

Найдите свою команду BOSSAC.

На моей машине Windows он был следующим:

C:\Users\username\AppData\Local\Arduino15\packages\arduino\tools\bossac\1.6.1-ardunio\bossac.exe

Он может быть под другим номером версии. Вполне возможно, что он будет находиться в совершенно другом месте.

cd %USERPROFILE%
dir bossac.exe /s/b/p/a

Должен же он его найти, в конце концов, в любом случае.

В Linux он будет находиться под ~/.arduino15 где-то:

find ~/.arduino15 -name bossac

На Mac он, вероятно, будет находиться где-то в каталоге /Библиотека/ под учетной записью пользователя. Вы получаете идею, находите ее, убедитесь, что можете запустить ее.

ПРИМЕЧАНИЕ: Существует программа bossa, которая является версией графического интерфейса, где bossac-это программа командной строки. К сожалению, файлы поддержки платы IDE не поставляются с графическим интерфейсом. Если у вас возникли проблемы с командной строкой и вы хотите попробовать это вместо этого, действуйте. Но проверьте это на плате, о которой вы заранее не заботитесь. Я еще не пробовал.

Подключение к исходному заголовку

Подключите свой родной USB-порт на плате-источнике и только к этому порту. Picture indicating native USB port

Включите загрузку в ПЗУ

Откройте эмулятор терминала по вашему выбору со скоростью 1200 бод на собственный USB-порт, подождите пару секунд, а затем закройте порт. Вы можете использовать последовательный монитор из среды разработки для этого, если хотите:

  • Выберите правильный порт в разделе Инструменты/Порт.

  • Откройте последовательный монитор

  • Переключите скорость передачи данных на 1200 бод.

  • Вы ничего не будете печатать и ничего не увидите, как только вы подключитесь со скоростью 1200 бод.

  • Закройте последовательный монитор

  • Вам, вероятно, следует:

    • Посмотрите, изменился ли порт COM#, если да, выберите новый.

    • Повторно откройте последовательный монитор

    • Снова измените скорость передачи данных на любую, кроме 1200 бод

    • Снова закройте последовательный монитор.
      В этом нет особой необходимости, но IDE запоминает последнюю выбранную скорость передачи данных, и для того, что мы делаем, это немного опасно.

  • Также закройте среду разработки.

То, что происходит при подключении с частотой 1200 БОД, - это активация кода внутри основной части программного скетча, который изменяет плату для загрузки с загрузчика внутреннего ПЗУ. Ему не нужно движение. Ему просто нужно увидеть запрос на 1200 бод. Более конкретно, он должен видеть, как "сигнал DTR" становится неактивным, что происходит, когда порт закрыт, когда эффективная скорость составляла 1200 бод.

ПРИМЕЧАНИЕ: если вы ошибетесь здесь и вместо этого подключитесь к программному порту на скорости 1200 бод, вы заставите ATmega16U2 стереть исходную плату. Среда IDE запоминает вашу последнюю выбранную скорость передачи данных в бодах, что также позволяет легко ее испортить. Отсюда и странный маленький танец в приведенных выше инструкциях, касающихся повторного открытия последовательного монитора и перехода на что-то другое, кроме 1200 бод. Это просто создает дополнительный барьер для того, чтобы случайно сделать это.

Как только вы подключитесь к встроенному USB-порту со скоростью 1200 бод и закроете порт, ваша плата больше не будет запускать ваш скетч. Он все еще там, просто он не работает. Плате было сказано сидеть в загрузчике на основе ПЗУ в ожидании команд загрузчика.

Сохранение изображения существующего скетча

То, что мы собираемся сделать, это запустить команду bossac, которую вы нашли ранее, примерно так:

bossac --read saved-sketch-image.bin --boot --reset

Я предполагаю, что вы либо сменили каталог на то, где bossac.exe есть, или, альтернативно, вы собираетесь указать необходимый путь к нему, найденный ранее. Я обнаружил, что эта команда автоматически находит правильный COM-порт.

Эта команда:

  • Загружает всю флэш-память объемом 512 кбайт и занимает 128 секунд за один тест. Странно, что одна и та же версия под Linux занимает около 10 секунд; Я не изучал, в чем разница, но меня это тоже не волнует.
    Таким образом, теперь у вас должен быть необработанный двоичный файл объемом 512 кбайт, содержащий изображение вашего скетча.

  • Он повторно включает загрузку с флэш-памяти, чтобы при следующем сбросе он вернулся к запуску вашего скетча

  • Он сбрасывает вашу плату, так что она начнет запускать ваш старый скетч. Если вы не хотите, чтобы это происходило до тех пор, пока вы не включите его, вы можете так же легко отказаться от части --сброс.

Как уже было сказано, это необработанный двоичный файл. Но вы упомянули о КОЛДОВСТВЕ. Я предполагаю, что вы не имели в виду это буквально, поэтому я не буду подробно описывать, как преобразовать файл .bin в шестнадцатеричный формат. Хотя, если вы хотите это сделать, вы должны знать, что он должен быть смещен на 0x80000, потому что именно там начинается флэш на должном.

Отсоедините исходную плату от USB.

Создание вашей платы-клона (цели)

Подключитесь к целевой плате через программный порт.

Picture indicating connection to target board's programming port

  • Удерживайте кнопку стирания в течение нескольких секунд, чтобы убедиться, что целевая панель стерта. Обычно это делается с помощью IDE, подключающейся к порту на некоторое время со скоростью 1200 бод. Но поскольку мы используем bossac в командной строке, нам нужно выполнить этот шаг вручную; на этот раз просто проще использовать кнопку.

  • Сбросьте плату с помощью кнопки сброса. Ваша целевая плата теперь находится в загрузчике ПЗУ, ожидая команд.

  • Поместите свое изображение на новую плату с:

bossac --write saved-sketch-image.bin --boot --reset
  • Опять же, он программирует все 512 кбайт. В одном тесте на Windows это заняло около 100 секунд; никакой разницы между Windows и Linux. Мы используем USART (порт программирования), который медленнее USB, и мы мигаем, а не читаем, что медленнее; Я не потрудился выяснить, какая вещь является узким местом.

  • Как и раньше-загрузка устанавливает плату для загрузки с флэш-памяти (ваш скетч) при следующем сбросе.

  • И снова-сброс просто сбрасывает плату.

Теперь ваша целевая плата должна вести себя аналогично исходной плате.

,

В bossac есть функция автоматического стирания Arduino, которая может упростить часть этой процедуры, но я ее еще не тестировал. Я оставляю все как есть, пока не смогу поиграть с этой опцией командной строки., @timemage

Теперь я успешно клонировал прошивку Due на другую с помощью 10-контактного заголовка JTAG, используя также OpenOCD, хотя может пройти некоторое время, прежде чем я обновлю это. Я еще не делал этого ни в Windows, ни через заголовок SWD, который, по-видимому, более надежно припаян. На данный момент: В любом случае, да, вы можете это сделать. Если вам нужна прошивка с помощью JTAG, что менее важно, чем чтение, просто знайте, что вам нужно выполнить команды OpenOCD "флэш-банк", прежде чем команда "программа" будет работать, и что если вы этого не сделаете, ошибка, которую вы получите из команды "программа", не прояснит это., @timemage

Большое вам спасибо, это сработало на 100%. И да, я имел в виду .бин нет .но это моя ошибка. Ты спасаешь мне жизнь :), @Abd-AlRahman Muhammad

Когда вы говорите, что *Это приведет к стиранию вашей платы, и на этом все*, вы имеете в виду .bin, верно?, а не то, что плата будет каким-то образом *привинчена* для дальнейшей работы с другими исходными кодами?, @Brethlosze

Эта фраза конкретно относится к тому, что произойдет, если вы подключитесь к своему программному порту со скоростью 1200 бод. Встроенное ПО atmeag16u2, которое ведет себя как последовательный приемопередатчик, было закодировано таким образом, что соединение со скоростью 1200 бод эффективно нажмет кнопку стирания для вас. Итак, нет, я не имею в виду, что он удалит файл, он удалит содержимое flash на самой плате. Учитывая, что цель здесь состоит в том, чтобы сохранить встроенное ПО на плате, казалось уместным предостеречь от выполнения этой вещи, которая полностью уничтожит встроенное ПО, находящееся в настоящее время на плате., @timemage

Подключение к программному порту со скоростью 1200 бод не разрушит ваше оборудование; это разрушит любые шансы на успех в восстановлении текущего содержимого flash., @timemage