Как записать загрузчик в arduino pro mini

от admin

Burning a bootloader (OptiBoot) on an Arduino Pro Mini using an Arduino Uno

The other day I got asked to look into burning a smaller bootloader (Optiboot) onto an Arduino Pro Mini to save some space on it for actual program code. I used an Arduino Uno as in-system-programmer (ISP) to get the job done. I think there are plenty of sources that document this, but I wanted to keep track of my progress and share my findings.

SPOILER : It turned out to be simple to burn the Optiboot bootloader on the Pro Mini once you understand that it is the default bootloader for the Arduino Uno board. You simply need to burn the Arduino Uno bootloader on the Arduino Pro Mini. So in this case that means burning the Arduino Uno bootloader on an Arduino Pro Mini using an Arduino Uno. Are you still with me? I’ll explain the ride below.

Programming the Arduino Uno to Serve as ISP

The first thing to do is set up the Arduino Uno as an ISP. To do so connect the Arduino Uno to your PC (I’m on Windows) as you normally would and in the examples section open ArduinoISP.

In Tools -> Board select Arduino/Genuino Uno and upload as you would upload any other script to the Uno.

boarduno

The Arduino Uno is now an in-system-programmer you can connect with any AVR compatible microcontroller (like the Arduino Pro Mini or other Arduinos) to program it.

Wiring

In my case I had to solder some headers onto the Arduino Pro Mini to be able to connect the pins I need to connect, which are: VCC, GND, RST, MISO, MOSI.

uno-pro-mini

VCC and GND are for power, RST is the reset line, SCK is a clock line (Serial Clock) and MISO and MOSI are for hooking up the Pro mini as a slave device of the Uno. MISO stands for: Master Input Slave Output and MOSI stands for Master Output Slave Input.

Burning a Bootloader (Not Optiboot)

Once the wiring is done the following settings need to be made to flash a bootloader to the Pro Mini:

  • Under Tools -> Board select Arduino Pro or Pro Mini.
  • Under Tools -> Processor select ATmega328 (5V, 16MHz).
  • Under Tools -> Programmer select Arduino as ISP (NOT ArduinoISP. )

Now you can burn the bootloader using Tools -> Burn Bootloader.

The question is however: which bootloader was burned to the Pro Mini? I needed a specific bootloader (Optiboot) to save up space and had no idea which bootloader I just burned to the Pro Mini. I guess the default one, but which is that? I figured out later that the first step is where I was going wrong. If you are here to get an answer on how to burn the Optiboot bootlaoder you can skip the following section and head to Burn Optiboot onto the Pro Mini.

The following section serves only as a bit of background that was part of my process in figuring out what bootloader I burned. It didn’t get me there directly, but is still interesting.

AVRDude

Having burned the default Pro Mini bootloader I realized Arduino IDE simply calls AVRDude to do so and I hoped to find an answer as to which bootloader I had now burned. I enabled more verbose logging in Arduino IDE to find out how it calls AVRDude.

I went to File -> Preferences and enabled verbose output during both compilation and upload:

arduino-verbose-logging

I now burned the bootloader again using Tools -> Burn Bootloader to find the following log output (excerpt):

Here you can clearly see that it simply runs avrdude with some of the settings we provided in Arduino IDE along with a reference to some configuration file named avrdude.conf. This is interesting, but the command itself doesn’t tell me which bootloader I just burned nor does the configuration file it references.

I figured that I could modify the avrdude command provided in the log to specify a specific bootloader should get the job done. After some quick googling I found something along these lines should work for a hex file named filename.hex:

I had to wrap the file path in double quotes because of space in the path and even though I didn’t have any hex file named filename.hex I would see the following in the output (excerpt):

This seemed promising. Apparently I’m able to upload a hex file this way using the command line by running avrdude.exe with different arguments. However, when trying to flash the bootloader of choice (OptiBoot) I would end up with some verification errors for reasons not obvious to me. I was probably doing something wrong on the command line or using a wrong hex file.

Interestingly there are tools that basically do the same thing: simply run avrdude.exe with some arguments, yet provide a Graphical User Interface to do so because command line interfaces suck if you don’t use them in an automated fashion.

An example of such a tool is XLoader, but that one didn’t work out for me when I tried. Arduino IDE also seems to be doing the same thing: run avrdude.exe to flash the bootloader, so there must be some way to specify which bootloader in it. As it turns out there is a way to do this, but it isn’t very obvious.

Burn Optiboot onto the Pro Mini

The bootloader I wanted to burn is called OptiBoot and can be found at https://github.com/Optiboot/optiboot. It turns that it is even the default for the Arduino Uno, so all I had to do differently when Burning a Bootloader is select the Arduino Uno as board. The first step becoming:

  • Under Tools -> Board select Arduino/Genuino Uno

So to sum it up:

  • Under Tools -> Board select Arduino/Genuino Uno.
  • Under Tools -> Processor select ATmega328 (5V, 16MHz).
  • Under Tools -> Programmer select Arduino as ISP

(EDIT: These last two steps that I have striked through are not available in Arduino IDE. I seem to have made an error while documenting these steps. Please refer to the comment section at the end to see what is up. Over there Daniel gives some feedback indicating the mistake. Sorry for any inconvenience)

Now you can burn the bootloader using Tools -> Burn Bootloader.

So, that is it right? Well, I’m not really satisified even though the job is done. If you look at the documentation the answers are there, but what is up with this magic about what bootloader is flashed on what board in the first place?

Boards Configuration

I dug a bit deeper and learned that there is a place where all the boards are defined. On my system I found the file in:

This is where Arduino IDE specifes which hex file to upload as bootloader and gives a whole new meaning to the boards section in Arduino IDE for me. Let’s look at an excerpt of the configuration for the board we have now selected, the Arduino/Genuino Uno:

It specifies the hex file right there under the uno.bootloader.file configuration value.

At least I found a match between the board and the bootloader, explaining why it works with this board selected. This also gives an opportunity to change the hex file and thus changing which bootloader is uploaded to a specific board. I could go to the config section for the Pro Mini and set this bootloader as the default and not deal with this in the future. Too bad for me this was a one-time job and I don’t care about future calls, but at least it was educational and I got to write this blog post.

2 thoughts on “ Burning a bootloader (OptiBoot) on an Arduino Pro Mini using an Arduino Uno ”

In the title “Burn Optiboot onto the Pro Mini” there is a question: If it is selected as you say …

Tools -> Board Arduino / Genuino Uno, does not appear as below:
Tools -> ATmega328 Processor (5V, 16MHz).
Because the Arduino / Genuino Uno board has been selected, ie to display Tools -> Processor ATmega328 (5V, 16MHz), you must select: Tools -> Board: “Arduino Nano” -> Arduino Nano.

What do you say about it?

Thank you for your feedback!

Unfortunately I cannot reproduce the steps I have documented in this blog post at the moment. When I wrote this post I figured out how to burn the Optiboot bootloader on the Pro Mini for a friend of mine and used his board, which I currently cannot access.

However, you most definitely are right that the steps listed are wrong. You seem to be right in that you can select “Arduino Nano” instead and just continue with the steps as listed, because it is mentioned on the OptiBoot Github page that Optiboot is the default bootloader for the Arduino Nano as of 2018. Great catch!

Another option might be to just execute the first step and skip the selection of the processor and such, which are indeed not available like you mentioned.

Again, I cannot verify all this right now. I will try to do so soon and then update accordingly. For now I’ll just add a note with your finding and reference this comment section with your feedback.

Прошивка загрузчика (bootloader) Optiboot в Arduino UNO, Arduino Nano, Arduino Pro mini

Optiboot — это загрузчик (bootloader) для Arduino и, соответственно, микроконтроллеров AVR, который занимает всего 512 Кб флеш-памяти, позволяет загружать прошивки на большей скорости и использовать watchdog в своих проектах..

Для того чтобы прошить загрузчик в свои платы, я использую USBasp программатор. Он стоит очень дёшево и для работы с ним не нужно дополнительных знаний — всё работает «из коробки».

Для начала подготовим программную часть. Запускаете Arduino IDE и переходите в настройки (Файл — Настройки). В текстовое поле «Дополнительные ссылки для Менеджера плат» вставляете ссылку https://github.com/Optiboot/optiboot/releases/download/v8.0/package_optiboot_optiboot-additional_index.json и жмёте ОК. Теперь IDE знает, откуда взять Optiboot.

Далее переходите в меню Инструменты — Плата и выбираете там «Менеджер плат» (должен быть самый верхний пункт). Открывается менеджер плат, в поиске вбиваете optiboot и устанавливаете его. После этого в списке появятся дополнительные поддерживаемые платы.

В этом списке нужно выбрать Optiboot 32-pin cpus поскольку в Arduino стоит микроконтроллер Atmega328P и у него 32 пинов. Если в вашей Arduino используется другой микроконтроллер, то выберете соответствующий пункт. Далее нужно выбрать соответствующие параметры процессора, частоты и программатор USBasp. С этим разобрались и переходим к подключению Arduino к программатору.

Подключаем программатор с Arduino к компьютеру и в Arduino IDE в пункте меню Инструменты выбираем «Записать загрузчик». После этого в вашу плату будет установлен загрузчик Optiboot.

Отключаем программатор, подключаем Arduino как обычно по USB, в меню Инструменты — программатор меняем USBasp на тот, что был (AVRISP mkll) и пробуем записать простой Blink, чтобы убедиться, что всё работает. Вот и всё.

Перепрошивка загрузчика платы Arduino Pro Mini

Необходимость в замене загрузчика возникла по причине отсутствия в оригинальной плате функционала сторожевого таймера (watchdog).

Нам потребуется
  • Arduino Pro Miniна чипе ATmega328P которую мы будем перепрошивать
  • Arduino Mega 2560 будем использовать в качестве программатора
  • Optiboot сам загрузчик который мы будем прошивать
Подготовка среды разработки
  • Заходим на GitHub проекта Optiboot жмем на “Clone or download”
  • Переходим в каталог «\Мои документы\Arduino\» и создаем в нем ветку каталогов \hardware\optiboot\avr\
  • Распаковываем скачанный архив. Находим каталог optiboot и переносим все его содержимое в ранее созданный каталог.
  • В перенесенных файлах находим boards-1.6.txt переименовываем в boards.txt, старый файл boards.txt соответственно заменяется новым.
Запускаем срезу Arduino IDE

В меню Инструменты – плата – внизу должны появиться наши новые платы

Читать:
Как сделать замок на велосипед

Превращаем Arduino Mega 2560 в программатор

Жмем Файл – Примеры – ArduinoISP и у нас откроется скетч который превратит нашу плату Mega 2560 в программатор.

Подключаем Arduino Mega 2560 к компьютеру, выбираем соответствующую плату и прошиваем в него наш скетч.

После прошивки вновь заходим в меню Инструменты – программатор и выбираем Arduino as ISP

Соединяем платы между собой
  • Arduino Mega 2560 выводы 50(MISO), 51(MOSI), 52(SCK), 53(SS) и 10(RESET)
  • Arduino Pro Mini выводы 12(MISO), 11(MOSI), 13(SCK), 10(SS) и 29(RST), так же выводы питания GND и VCC

После того как мы все соединили в меню Инструменты жмем Записать загрузчик. Начинается процесс записи, по окончанию которого в плату будет записан новый загрузчик.

Теперь при работе мы должны выбирать плату «Optiboot on 32-pins cpus»

Как записать загрузчик в arduino pro mini

Arduino Pro Mini

Arduino Pro Mini весьма привлекательная плата из семейства Ардуино в первую очередь маленькими габаритами и ценой.

Зачем перезаписывать загрузчик

  1. Если загрузчик «слетел» и плата не прошивается. Выдает всегда: «avrdude: stk500_recv(): programmer is not responding».
  2. Если вы решили разобраться со сторожевым таймером, как в этой статье, и использовать для этого OPTIBOOT.
  3. Если нужно переустановить ФЬЮЗ-биты, например, как в моем случае, отключить контроль напряжения питания для того чтобы запитать плату от 3.3В
  4. Или же вы решили совсем убрать загрузчик с целью экономии памяти и увеличения скорости загрузки, тогда вместо загрузчика заливается ваша программа по нулевому адресу.

002

Что для этого нужно

Подключение

Все Arduino имеющие 6-пиновый IСSP разъем подключаются к программатору через такой переходник

Arduino Pro Mini ICSP на плате не имеет, поэтому подключаем проводками по следующей схеме

Схема подключения

Подключаем программатор к USB компьютера, устанавливаем драйвер USBAsp (если он еще не установлен) и запускам среду Arduino IDE

Прошивка Arduino Pro Mini

Выбираем тип программатора USBASP

Выбор программатора

Выбираем тип контроллера. Если мы хотим просто восстановить загрузчик — выбираем Arduino Pro Mini 5В (или 3.3В в зависимости от платы). Если нам нужен OPTIBOOT без лишней головной боли — выбираем Arduino UNO

Выбор контроллера

Затем жмем «Записать загрузчик»

Записать загрузчик

Если все подключено и настроено правильно, то программатор довольно долго мигает лампочками.

Настройка параметров загрузчика

Последнее время применяю Aduino Pro Mini 5В с модулями NRF24L01+, требующих для питания 3.3В. Для питания таких плат от низкого напряжения нужно отключить во фьюзах контроль напряжения питания. Для этого открываем файл c:\Program Files (x86)\Arduino\hardware\arduino\boards.txt и прописываем в нем характеристики желаемой прошивки:

После этого шьем выбираем тип контроллера «Atmega328_16 (3.3V, 16 MHz external)» и пишем загрузчик.

Программируя «перешитый» Arduino Pro Mini через стандартный порт не нужно забывать устанавливать нужный тип контроллера

44 комментария на «Перезапись загрузчика в Arduino Pro Mini»

Есть вариант Arduino Pro Mini с нераспаянным 6-контактным ICSP. Например

AlexeyAlexey :

Да. Только там штырьки в ряд а не в два ряда, как в стандартном разъеме
Поэтому все равно проводочками соединять

Вы не правы, Alexey. контакты ICSP расположены в 2 ряда. Маркировка есть на обратной стороне платы (по выложенному мной лоту видно на третьей фотографии).

AlexeyAlexey :

Да. Увидел. Очень нечеткая картинка.
Интересный дизайн. Еще бы на нем поставили 3.3 стабилизатор и вывели бы на I2C

Добрый день. Хотел спросить, правильно ли я понял, у вас arduino pro mini 5 вольтная версия, вы её как бы сделали 3 вольтной. При этом стабилизатор остался старый, кварц на 16 Мгц, и запитываете это всё напрямую в обход стабилизатора на плате 3.3 Вольтами. Интересуюсь дотошно ибо хочу сделать из arduino pro micro тоже (только стаб перепаяю)

AlexeyAlexey :

Да все так.
Я поменял фьюз-бит контроля напряжения питания на контроллере, иначе он отключался при низком напряжении.
По даташиту еще рекомендуют понизить тактовую частоту, но у меня на 16МГц стабильно все работает.
При напряжении питания 3.3В не вижу в стабе вообще смысла.

Спасибо за ответ, будем пробовать.

Доброго времени суток.
Не подскажите как определить на какое питание ардуина, заказал несколько штук, пришли по виду одинаковые или не замораживаться и сразу прошивать на 3 вольта?
Спасибо и всего доброго.

AlexeyAlexey :

Платы немного отличаются дизайном.
Но у них и 5-вольтовых разный дизайн от версии к версии.
Самый простой способ подключить к IDE Arduino.

Подать 5В через USB. 3-х вольтовый от 5В тоже работает.
И попробовать залить скетч выбирая нужную плату.

Подскажи, плиз, как убрать загрузчик вовсе? Нужно для быстрого старта, сразу после подачи питания
arduino pro mini 5v

Перестала прошиваться pro mini 328 5v 16Мгц как через ftdi,так и через AVRasp (isp) программаторы.Пытался залить через ISP загрузчик,процесс пошел,а потом прирвался и выкидывал ошибки вида: avrdude: stk500_recv(): programmer is not responding» и avrdude: verification error, first mismatch at byte 0x1c00
0x12 != 0xff
avrdude: verification error; content mismatch.
Раньше при тех же инструментах/манипуляциях проблем не было.
Менял:кабели,программаторы,среду обновлял — не помогло.

Ардуино mega 2560 при тех же инструментах шьется нормально.

AlexeyAlexey :

Может фьюзы попротились?

Как их откатить/восстановить?

AlexeyAlexey :

Добрый день.
Если прошить в про мини бутлоадер ему это не повредит? Будет работать watchdog? И какую плату надо будет выбирать в студии для заливки скетча ?

бутлоадер от Uno

AlexeyAlexey :

Бутлоадер от UNO это optoboot поддерживающий нормально сторожевой таймер.
На Pro Mini будет работать (если контроллер Atmega328p), только потом нужно карту выбирать при загрузке скетчей — Uno.

Спасибо за информацию. Надо будет попробовать. Никаких подводных камней не наблюдается при этом?

AlexeyAlexey :

Благодарю за информацию

Вроде залился бутлодырь))Пасиб за информацию!

На картинке подключения USBasp не перепутаны выводы MOSI,MISO?Судя по распиновке вывод дуины 11 соответствует выводу 16 МК, а это MISO,который почему то на 12 выводе дуины…Можь надо исправить?

AlexeyAlexey :

Да вроде все нормально. У Atmega 8/168/328 MOSI — DIO11, MISO — DIO12

Привет.
Понимаю, что тема сообщения другая. Перебросьте туда, где ему положено быть, если сообщение мешается здесь.
Только начал изучать Ардуино и вот что-то непонятное произошло — после загрузки скетча «мерцание» (в RobotDyn UNO) всё стало работать как и должно, но… теперь мерцает всегда. Ничего не позволяет в себя загрузить.
Проинструктируйте, пожалуйста.

AlexeyAlexey :

Не совсем понятно что за «мерцание». Не загружаться может по разным причинам.

1. работает сторожевой таймер отправляя Ардуину в циклическую перезагрузку. Здесь можно попытаться поймать момент загрузки (в Ардуино IDE в логе нужно смотреть вывод) и успеть перед ним нажать РЕСЕТ

2. Слетел загрузчик или фьюзы. Тут нужно использовать ICSP разъем для внутрисхемного программирования и восстановить загрузчик и фьюзы, например, так как описано в этой статье. Можно это сделать при помощи другого Ардуино и 6-ти проводков.

3. Неисправная Ардуино. Сгорела микросхема USB/TTL конвертера. В этом случае, если еспи чип рабочий, то его можно будет программировать, но только опять же через ICSP. Если неисправно что-то другое — чинить или выкинуть

спасибо
мерцание — blink
Вы правы. Я допустил вольный (привычный мне) перевод. После посмотрел в интернет, везде переводится как «мигание, моргание» в связке с Ардуино. Извиняюсь. Мне стоило использовать язык оригинала.
После переустановки пакета версии 1.7.11 с офсайта пропали сообщения об ошибках ld.exe. Это радует, потому что, изменяя в скетче «blink» параметры delay теперь, можно видеть, что светодиод на плате слушается команд.
А раньше (при попытке загрузить скетч) компилятор выдавал ошибку — и всё тут.
Теперь при загрузке другого скетча проскочило такое сообщение:
avrdude: ser_open(): can’t open device «\\.\COM1»: Не удается найти указанный файл.
Хотя порт выбран СОМ4 и скетч «blink» по нему загрузился без ошибок

AlexeyAlexey :

В Arduino IDE
Файл -> Настройки
Установить галку «Показать подробный вывод: Загрузка»
Можно посмотреть подробно, что делает/пытается сделать IDE.
Я сижу на версии 1.6.5, так как она корректно работает с ESP8266. Может быть это особенности 1.7

спасибо.
выставил маркер, где вы указали.
займусь анализом подробных выводов.

Скажите пожалуйста Уважаемый.
У Вас и не только(много примеров в интернете)
для отключения проверки уровня напряжений, используется в Extended Fuse = 0x07
При попытке прошить, дудка(Avrdude) то ли ругается, то ли предупреждает и предлагает вариант для Extended fuse прописать 0xFF
И действительно, в различных он-лайн калькуляторах для проца 328P, в Extended фьюзах, только младшие 3 бита отвечают за контроль напряжения(BODLEVEL), а остальные 5 бит вообще свободны и никуда не используются. Почему же тогда везде советуют делать 0x07? Какой смысл выставлять в 0 старшие 5 бит, если они никуда не нужны? Почему не 0xFF, на чeм настаивает дудка? Развейте мои сомнения, пожалуйста, помогите чайнику. Заранее спасибо.

AlexeyAlexey :

Вы правы. Там только 3 байта значащие
Это калькулятор ставит 0xFF как нравится дудке )))
http://www.engbedded.com/fusecalc/
Я скорее всего где то тоже из примеров взял фьюзы. Проверил — они не противоречат правильной конфе. Так и копируются по всему интернету

А можно еще пару вопросов? Наверняка ламерские, но не обессудьте? Я совсем чайник и прошу быть снисходительным и тапками не закидывать. Я в вашем МК-мире, от силы, недели две.
1. При прошивке скетча в среде Ардуино, каждый раз прошивается только скетч или и загрузчик тоже? И отличается ли процесс прошивки, если шить скетч программатором из Экслипса, Дудкой, по сравнению с Ардуиной? В Ардуине не видно команд и процесса прошивки Дудкой в реальном времени. Когда прошивал через программатор из Экслипса, обратил внимание(там все видать в натуре), что в командной строке Дудки был ключ -D, т.е. предварительная очистка флэша. Это имеется ввиду полная очистка контроллера или бутлоадер остается? Как ФайлСкетча.HEX знает, где ему размещаться, где заканчивается бутлоадер? И не стерся ли бутлоадер, который я сначала прошивал отдельно из командной строки, подглядев предварительно, как она выглядит при прошивке из Экслипса. А если бутлоадер не родной, а в частности Optiboot для Pro Mini? Ткните носом пожалуйста, где про всю эту кухню почитать, как все это организуется? Желательно по русски и простым языком.
2. Как во фьюзах выбирать параметры BOOTSZ, Boot Flash Sector Size, сколько слов и адрес? Почему в калькуляторе фьюзов, при выборе разного размера этих самых слов, Boot Start Address изменяется, странными значениями $3F00, $3C00, $3800? Разве стартовый адрес загрузчика не начинается от нулевого адреса и почему он(стартовый адрес) зависит от длины бутлоадера? И почему, если выбираешь бутлоадер длиннее, то адрес меньше? Size=256 words — address = $3F00, а когда 2048 words, address= $3800 Как все это понимать? Заранее спасибо.

AlexeyAlexey :

Бутлоадер может переписывается только если работать через программатор. Когда программа заливается через бутлоадер, то сам бутлоадер затереть невозможно, также как и изменить фьюзы. В этом и прелесть Ардуины в отличии от «голых» микроконтроллеров.

Для того чтобы полностью видеть процесс загрузки:
Файл -> Настройки ->Показать подробный вывод ->Загрузки (поставить галочку)

Фьюзы, размер загрузчика, начальный адрес и как это все организуется прописывается в файле board.txt для данного контроллера.

$3F00 = 16128
$3800 = 14336
наводит на мысль, что это размер памяти основной программы (общий размер памяти — размер загрузчика)

Спасибо за ответ. У меня Линукс и в его ArduinoIDE, почему-то нет такой опции, выбрать просмотр процесса прошивки. Т.е. если я шью через Ардуину, я фактически шью только саму основную прогу, а если через программатор, то как мне знать, остался ли бутлоадер? А зачем он вообще тогда нужен? Какая его главная функция, если и без него можно прошить саму программу и будет работать?

Теперь стало понятно про адресацию из калькуляторов фьюзов, при разных размерах загрузчика.

День добрый ! Подскажите,как убрать загрузчик из ардуино, как необходимо изменить при этом файлы Arduino IDE? А то в начале статьи упоминается в 4м пункте как загрузчик удалить, а в самой статье об этом ни слова! Спасибо.

Здравствуйте, для плат pro mini на чипе 168 это актуально?

AlexeyAlexey :

Да. Только в board.txt соответствующий контроллер нужно выбрать

здравствуйте.
не могли бы Вы ликвидировать мою безграмотность вот в каком вопросе. имеется атмега 328р-au 20 мгц можно ли ее прошить используя в качестве ардуино уно в качестве программатора?

AlexeyAlexey :

Похожие публикации