Одновременно записать загрузчик arduino и скомпилированный скетч

Как записать загрузчик и код скетча на ардуино через ISP, а затем снова написать код скетча с помощью Arduino IDE позже?

В настоящее время я могу написать загрузчик через ISP, а затем написать скетч через Arduino IDE. Это работает нормально.

Я также могу написать загрузчик и скетч через ISP. Код работает как обычно, но я не могу загрузить новую версию скетча через Arduino IDE. Это просто тайм-аут.

Вот что говорит среда разработки, когда она пытается загрузить программу:

avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : wiring
         Overriding Baud Rate          : 115200
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

Среда IDE Arduino создает два шестнадцатеричных файла после компиляции скетча: один - это просто скомпилированный скетч (Sketch.ino.hex), а другой-скомпилированный скетч с кодом загрузчика, добавленным в конец (Sketch.ino.with_bootloader.hex). Чувствую, что это должно быть возможно, потому что Arduino создает файл.

, 👍2

Обсуждение

Существует несколько вероятных причин, по которым загрузчик не работает при контакте с acrdude, управляемым средой разработки Arduin. Возможно, написание комбинации скомпилированного скетча и загрузчика с использованием ISP не позволяет ATmega запускать загрузчик в ответ на удаленный сброс IDE. Например, комбинация не связана правильно, поэтому загрузчик не "подключен" к прерыванию СБРОСА. Или загрузчик не установлен в нужное место. Знаете ли вы, как использовать objdump, чтобы проверить, что код находится по правильному адресу, а векторы прерываний имеют правильное значение?, @gbulmer

Резюме: ИМХО Теоретически все, что угодно, может быть записано в ATmega flash через интернет-провайдера. Должно быть *возможно* написать загрузчик и программу одновременно через интернет-провайдера. Однако, ИМХО, вам нужно будет опубликовать сценарий ссылки, конфигурацию avrdude и командную строку, программу и ссылку на загрузчик, чтобы получить точный ответ., @gbulmer

Вы вполне можете просто объединить шестнадцатеричные файлы., @Chris Stratton

IDE Arduino объединяет файлы для меня. Это файл, который я загружаю. Кроме того, я не использую AVR, чувак. Мой код скетча скомпилирован с помощью Arduino IDE. Все делается с помощью Arduino IDE, за исключением того, что я загружаю загрузчик с помощью mkII AVR-провайдера, который подключается к Atmel Studio., @Joey M

Я никогда не видел, чтобы IDE arduino делала это, но я уверен, что вы не ошибаетесь (я должен разобраться в этом сам). Первое, что приходит в голову, что установлены неправильные предохранители, поэтому он никогда не переходит к загрузчику. Не могли бы вы добавить подробный вывод компиляции и загрузки кода с помощью загрузчика в свой вопрос? Также, какую версию вы используете?, @Gerben

Я разобрался в проблеме. Оказывается, Arduino не сбрасывался после загрузки кода, поэтому он не запускался должным образом, что заставило меня поверить, что он не работает. Мне просто нужно было нажать кнопку сброса, а затем код скетча выполнялся в обычном режиме. Таким образом, вы можете загрузить загрузчик и код скетча одновременно, не делая ничего особенного, и это будет работать так, как если бы вы загрузили загрузчик через интернет-провайдера, а код скетча - через Arduino IDE., @Joey M


3 ответа


1

Если вы программируете через ISP, он стирает загрузчик, потому что он вам не нужен. Весь смысл загрузчика в том, чтобы разрешить программирование через USB. Поэтому, если вы хотите использовать обычный USB-вход Arduino для программирования, запишите загрузчик, а затем не используйте ISP.

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

,

Я программирую код скетча и загрузчик одновременно, чтобы загрузчик не был удален. Код загрузчика определенно есть. Я могу прочитать память через интернет-провайдера и увидеть, что код загрузчика там есть., @Joey M

Вы устанавливаете опцию программатора обратно на опцию arduino в программном обеспечении Arduino? Stk500, это тот программатор, который arduino использует по умолчанию, или это ваш интернет-провайдер?, @MadHatter

Я использую Atmel Studio для запуска AVR-провайдера. Затем я подключаю USB - кабель и использую Arduino IDE. Поэтому я ничего не меняю в среде IDE Arduino. В среде IDE Arduino используется STK500., @Joey M

Хм, странно, я думаю, я не был полезен, надеюсь, у кого-то еще будет больше опыта в этом., @MadHatter


1

Обычно (при использовании IDE через последовательный интерфейс/USB) загрузчик сохраняется, а сам загрузчик заменяет основной код.

Если вы программируете ICSP, то первое, что должен сделать программатор, - это стереть весь чип (включая загрузчик). Теперь ничто не мешает вам вернуть загрузчик как часть последовательности программирования (это немного увеличит время программирования).

Как предполагает Крис Страттон, это в основном объединение шестнадцатеричного файла для скетча и шестнадцатеричного файла для загрузчика. Я не уверен, что их буквальное объединение сработает, потому что в шестнадцатеричном файле есть несколько других "типов записей", которые могут сбить с толку программатор, если они будут встречаться дважды, в частности, тип записи "конец файла".

Однако стратегия в этом направлении должна дать вам файл, который можно загрузить и вернуть загрузчик:

  • Возьмите шестнадцатеричный файл из компилятора и скопируйте его до записи "конец файла", но исключая ее, во временный файл.
  • Добавьте нужный шестнадцатеричный файл загрузчика (включая строку "конец файла").
  • Запрограммируйте чип с помощью полученного файла.

Для более крупных микросхем (таких как Atmega2560) вам нужно быть осторожным при обработке записи "адрес расширенного сегмента", поскольку это устанавливает байт высокого порядка для запрограммируемого адреса.

Формат шестнадцатеричного файла, как описано в моем скетче программатора, выглядит следующим образом:

Line format:

  :nnaaaatt(data)ss

  Where:
  :      = a colon

  (All of below in hex format)

  nn     = length of data part
  aaaa   = address (eg. where to write data)
  tt     = transaction type
           00 = data
           01 = end of file
           02 = extended segment address (changes high-order byte of the address)
           03 = start segment address *
           04 = linear address *
           05 = start linear address *
  (data) = variable length data
  ss     = sumcheck

            * We don't use these
,

1

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

Этот шестнадцатеричный файл затем используется для программирования остальных микросхем для производства. (Если вы чувствуете, что это занимает слишком много времени, можно удалить шестнадцатеричный файл, но это может быть немного сложнее)

,