Digitrode
цифровая электроника вычислительная техника встраиваемые системы
Как выгрузить код в виде Hex-файла из Arduino
В некоторых случаях, особенно при реверс инжиниринге, необходимо получить код из микроконтроллера. В случае с Arduino это тоже бывает актуально, и самое главное, что это возможно. Полученный код будет в шестнадцатеричной формате hex-файла, и в данном материале мы рассмотрим как реализовать такую выгрузку кода из Arduino, используя программатор avrdude.
Итак, в нашем случае плата Arduino обнаруживается на последовательном порту USB COM4.
Мы откроем окно командной строки через cmd и введем следующую строку:
ПК прочитает программу во флэш-памяти платы Arduino и запишет на компьютер файл с именем «board.hex».
Измените :r: на :w: и вы сможете записать шестнадцатеричный файл обратно во флэш-память Arduino. Или загрузить его на другую плату.
Программа под названием avr-objdump позволит вам дизассемблировать исполняемый код в ассемблерный код, который вы сможете прочитать и реконструировать. Программа avr-objdump имеет множество опций.
Avr-objdump конвертирует исполняемые файлы. Здесь он генерирует дизассемблерный код.
Файлы в шестнадцатеричном формате Intel можно открыть и прочитать с помощью блокнота или специальной программы для чтения шестнадцатеричных файлов. Эмуляторы могут загружать и запускать шестнадцатеричную программу так же, как аппаратное устройство.
Arduino IDE может предоставить вам шестнадцатеричный файл через меню Sketch-Export скомпилированный двоичный файл. Вы можете создавать исполняемые шестнадцатеричные файлы, которые будут работать на вашем Arduino, из IDE, таких как WinAVR, CodeBlocks, MPLab, AtmelStudio, и из командной строки.
Как загрузить hex файл в ардуино Arduino hex avr
Сегодня вы узнаете как загрузить hex файл в ардуино. Это первая часть из серии уроков про hex формат. Я расскажу и покажу как сделать hex файл arduino используя arduino ide. Написав исходный код очень просто выполнить прошивку hex файла. Вы узнаете все плюсы и минусы использования HEX файла. Если вы не хотите или вам некогда заниматься программированием, то hex code это для вас. Во второй части я расскажу как прошивать HEX файл в ардуино используя различные внешние программы. Вы узнаете чем открыть hex файл прошивки.
Мне в последнее время всё чаще стали задавать вопросы, как можно проще загружать скетч в Ардуину. Я понимаю, что не все хотят вникать в азы программирования. Многим надо просто быстро сделать проект. У них нет интереса в установки Ардуино IDE, поиск различных библиотек, настройке и установке параметров. Хочется просто подключил Ардуину, нажал кнопку и всё готово. Вот для них я и буду теперь вместе со скетчем выкладывать ещё и HEX файл. Этот файл надо будет просто загрузить в Ардуино и всё. Больше не надо разбираться в коде, искать и устанавливать библиотеки, думать правильно я сделал или нет. Это очень удобно и быстро. Но всё же собирать схему придётся самому. Этого за вас никто не сделает.
Когда вы пишите свой код или как он по-другому называется — Скетч. То на выходе вы получаете исходный код. А когда прошиваете Ардуино, ваш исходный код компилируется в бинарный код, такой код Ардуине проще понять. И обычно он имеет расширение HEX.
- Преимущество HEX файла – это простота ее использования:
- Не нужны никакие библиотеки,
- Легко загрузить в плату,
- Можно перенести с одного устройства на другое.
Но как всегда если есть плюсы, то должны быть и минусы. По правде сказать – это не минус, а так, маленький недостаток. Из HEX файла невозможность воссоздать исходный код, нельзя понять как работает программа и внести какие-нибудь изменения.
Так же HEX файл нужен для работы с внешними программами, например с Протеусом. А ещё в последнее время, в интернете, всё чаще стали попадаться не исходники кода, а уже скомпилированный HEX файл. Для этого есть несколько причин.
Одна из них, разработчик не хочет делиться исходным кодом и для доработки приходиться с ним связываться, и скорее всего платить деньги.
Второй причина – это если проект очень сложный и для его настройки требуется много действий, то проще настроить всё самому, а потом выложить HEX файл. Что бы потом в комментариях не возникало много вопросов. От простых, где взять библиотеку, до «А у меня ничего не работает». Загрузив HEX файл вы можете быть уверены, что код рабочий, а если у вас «ничего не работает» , то значит вы что-то не так собрали. И разбираться нужно именно в этом.
Короче, что такое HEX и для чего он нужен мы разобрались. Теперь давайте научимся получать его из своего кода.
Получение HEX файла.
Давайте запустим Ардуино IDE и какой-нибудь из примеров. Все наверняка догадались что это будет пример BLINK.
Теперь проверим, подключена ли у нас плата Ардуино и к какому порту она подсоединена.
Хотя скажу по секрету, это нам не особо нужно. Получить HEX файл можно вообще не имея Ардуины в наличии.
Заходим в меню Файл и выбираем пункт Настройки.
Устанавливаем галочку в строке Показать подробный вывод, в чекбоксе Компиляция. И всё.
Теперь можно прошить Ардуину, а можно нажать на кнопку Проверить.
Начнётся компиляция вашего кода. Это можно увидеть по обилию текста снизу экрана.
После окончания нужно найти строчку кода с расширением HEX. Это адрес временной папки где будет сохранён HEX файл. Он там будет находиться до тех пор пока вы не закроете Arduino IDE .
Теперь давайте откроем этот файл и посмотрим как он выглядит. Я буду использовать TOTAL Commander, а вы, тут программу, что вам удобна.
У меня он открылся в NOTEPAD++.
Мы видим 60 строчек кода, который совсем не похож на тот что вы написали. Вот с этим кодом и работает Ардуина.
Теперь давайте сравним ваш исходный код и то что получилось после компиляции.
Согласитесь, Небо и Земля.
А теперь давайте перейдём в папку где хранится наш HEX файл.
Переходим по адресу который у нас в командной строке. И видим, что там целая папка с разными файлами. Мы некоторые из них рассмотрим чуть позже. Находим наш HEX файл. Для особо внимательных, там 2 HEX файла. С бутлоадером и без него.
Теперь давайте возьмём другой файл, посложнее. Там и кода побольше и чтобы была применена библиотека. Кстати эта библиотека не входит в стандартную установку Ардуино IDE. И для работы с этим скетчем, вам бы пришлось самому устанавливать эту библиотеку. Или просто загрузить её и весь скетч через HEX файл.
Делаем всё тоже самое что и раньше.
Нажимаем кнопку Проверить. Ждём окончания компиляции и переходим по адресу HEX файла.
Находим и открываем папку.
Вот мы и научились получать HEX файл из своего исходного кода.
Следующий шаг это загрузка HEX файла в Ардуино.
Загрузка HEX в AVR Ардуино
Вторая часть про загрузку HEX файлов в микроконтроллер AVR установленный в плату Ардуино. В первой части я показал как сделать HEX файл и в куда его сохраняет программа arduino ide на компьютере. Во второй части будем использовать avrdude и программу gcUploader. Загрузим скомпилированный HEX файл.
Сегодня продолжим изучение HEX файлов. Это буде небольшое видео. Так как особо показывать нечего.
В первой части я показал как можно сделать HEX файл и в куда его сохраняет программа arduino ide на компьютере. Поэтому мы быстренько пройдём этот этап почти без объяснений. Кому, что будет не понятно смотрите предыдущее видео.
Сначала проверяем что бы к нас была подключена Ардуина и запоминаем в какой порт она вставлена. Это нам пригодиться чуть дальше.
Прошивать будем как всегда Blink. Я его часто использую потому что для его работы ничего не надо, так как мигать будет светодиод установленный на плату.
Заходим в настройки и проверяем чтобы был установлен флажок Компиляция.
Нажимаем кнопку Проверить. Этим мы скомпилируем код и сохраним его в папку на компьютере даже если у вас не подключена плата Ардуино.
Находим адрес папки где находится скомпилированный HEX файл. Я сохраню его в отдельную папку, но это делать не обязательно для работы нам хватило бы и просто этого адреса. А ещё я переименую его, так как у вас может быть несколько разных файлов.
Для того чтобы прошить HEX в плату нам нужна программа AVRDUDE. Эта программа принимает на вход скомпилированный код из ARDUINO IDE, и отправляет его в микроконтроллер AVR на котором создана Ардуино.
AVRDUDE входит в комплект программы ARDUINO IDE. Неудобство использования этой программы в том, что использовать её можно только из командной строки. После вызова этой программы надо прописать довольно много параметров.
Вот пример
«C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe» -C «C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf» -v -p atmega328p -c arduino -P COM3 -b 57600 -D -U flash:w:D:\Documents\Arduino\my_hex.hex:i
Согласитесь это не совсем удобно. Есть более лёгкий способ. Было разработано много программ-оболочек для облегчения способа прошивки. Рассмотрим одну из оболочек. Это программа «gcUploader».
Она также использует AVRDUDE который находится в папке программы, но теперь не надо вводить команды достаточно просто выбрать всё из выпадающего списка, а в поле HEX перенести файл.
Для начала выбираем Свою Ардуину и COM порт к которому она подключена.
Перетаскиваем HEX файл. И нажимаем на картинку похожую на микросхему. Если у вас установлено выводить лог, то вы увидите информацию о прошивке. Вот и всё. Микроконтроллер прошит.
Конечно вы сейчас не видите большой разницы между обычной прошивкой через ARDUINO IDE и прошивкой с помощью сторонней программы. А вот когда вы сделаете большой проект, где будут несколько библиотек которые не идут в комплекте с ARDUINO IDE и их придётся искать и устанавливать. И вам надо будет передать кому-нибудь этот проект, то вам уже не нужно будет объяснять, где взять и как установить библиотеки. Или вы не хотите чтобы кто-то мог самостоятельно изменять параметры тогда вы увидите всю прелесть этого способа.
104-Прошивка любого Hex-файла в Arduino при помощи штатного загрузчика (Bootloader).
Давайте немного отвлечемся от создания нашего робота и поговорим о том, как мы будем записывать прошивку в Arduino.
Нас, прежде всего, интересуют три платы Arduino:
— Arduino Uno – как самый распространенный вариант
— Arduino Nano – компактный вариант, удобный для применения в небольших конструкциях
— Arduino Pro Mini – дешевый компактный вариант без встроенного USB-UART преобразователя (для работы с ним понадобится внешний USB-UART преобразователь), но удобный в случае применения сети устройств.
Во всех вышеописанных платах используется микроконтроллер ATmega328 (в более старых версиях ATmega168).
Одной из главных причин выбора платы Arduino для проекта робота была возможность записывать прошивку устройства в МК не применяя программатора и каких либо дополнительных устройств. Все что нужно для прошивки микроконтроллера Arduino – это стандартный USB шнур (который входит в комплект Arduino).
Это значит, если Вы имеете Ардуину – Вы имеете любое устройство ZiChip!
Запись программы в МК через USB происходит через специальный загрузчик (Bootloader), который записан в МК при изготовлении платы. Вообще, загрузчик предназначен для работы со своим специальным программным обеспечением Arduino IDE, но в случае, когда необходимо прошить в Ардуину что-то постороннее (свой Hex-файл), есть программки позволяющее это реализовать.
Начнем, конечно, с моей программы загрузчика
GC-Uploader
Программа интересна тем, что выбранный HEX-файл будет заливаться в Ардуину автоматически после каждого его изменения. Это удобно, так как при разработке проекта каждая компиляция (обновление хекса) будет инициировать прошивку Ардуины — Вам ничего не придется делать самому! Кроме того в программе есть и ручной режим прошивки.
Следующая — маленькая и удобная
XLoader (Arduino HEX uploader)
Программка имеет аскетичный интерфейс и работать с ней предельно просто:
— подключаем Arduino в USB-порт (отдельного питания не нужно)
— выбираем Hex файл
— выбираем тип Вашего Arduino
— выбираем COM порт, который создался при подключении Arduino к USB (скорость порта автоматически подставится при выборе типа Arduino)
— жмем Upload
Это все! Ничего сложного. Прошивка через несколько секунд будет записана в МК и автоматически запустится. Один минус – программа никак не сообщает о том, что прошивка уже записана, но это можно увидеть по прекращению мерцания светодиодов RXD и TXD на Ардуине.
XLoader использует для записи прошивки AVR Dude и в качестве протокола программирования используется STK500. Но, похоже, в настройках AVR Dude, произведена коррекция, так как использование стандартного AVR Dude с такими же настройками не дает результатов.
Автоматизация XLoader.
При разработке ПО для микроконтроллера производится очень много прошивок и всегда нужно стремиться автоматизировать этот процесс после сборки проекта — это экономит время и нервы. В данном случае автоматизация усложнена, так как программа не показывает командную строку для AVR Dude (разве что подбирать опытным путем), но некоторое упрощение процесса возможно. Делается это следующим способом – после первой прошивки не закрываем окно программы (COM порт после прошивки программа отпускает) и после следующей сборки проекта просто жмем кнопку «Upload». Конечно, сборка должна осуществляться в один и тот же Hex-файл.
Как и предыдущая, программка имеет простой интерфейс.
Процесс прошивки тот же:
— подключаем Arduino в USB-порт (отдельного питания не нужно)
— выбираем Hex файл
— выбираем тип Вашего Arduino
— выбираем COM порт
— жмем Upload
Программа при записи открывает дополнительные окна и визуально отображает свои действия, что позволяет следить за процессом записи.
При попытке прошить Arduino Nano программа отказывалась видеть МК. Причиной стала неправильная установка скорости COM порта. По умолчанию скорость стоит 19200, а нужно 57600. Скорость порта в программе не задается явно, она прописывается в строчке «AVR Dude Params» — поменяйте в ней значение 19200 на 57600.
Автоматизация ARP Uploader.
ARP Uploader как и XLoader работает через AVR Dude, но, в отличие от XLoader, показывает командную строку. Это дает возможность использовать AVR Dude напрямую в Make или Bat файле.
Дополнительные материалы.
Драйвера Arduino.
Считаю не лишним напомнить, что для связи Arduino с компьютером в последнем должны присутствовать драйвера. Оставляю здесь архив с драйверами для Arduino (включая и старые драйвера в Old_Arduino_Drivers.zip и драйвера для FTDI-чипа в папке «FTDI USB Drivers»
Стали появляться недорогие китайские Ардуины с драйвером CH340G
Driver-CH340G.zip (10246 Загрузок)
Загрузчики Arduino
Если Вы решите собрать свою плату Arduino (а сложного там ничего нет, фактически, это голый ATmega328 или ATmega168), Вам понадобится загрузчик Bootloader который должен содержать МК для работы со средой (или программками для заливки Hex-файлов). Конечно, Вам для записи Hex-файлов в чистый МК понадобится программатор и придется выставить фьюзы.
ATmegaBOOT_168_atmega328.zip (12842 Загрузки)
Для правильной работы нужно установить фьюзы следующим образом Low: FF High: DA Ext: 05
Схемы Arduino
Фьюзы установленные по умолчанию в Arduino (только с ATmega328)
Arduino Uno
Low Fuse 0xFF
High Fuse 0xDE
Extended Fuse 0x05
Arduino Duemilanove or Nano w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
Arduino BT w/ ATmega328
Low Fuse 0xFF
High Fuse 0xD8
Extended Fuse 0x05
LilyPad Arduino w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05