Что на самом деле происходит, когда я загружаю новый скетч в Arduino Uno с помощью загрузчика Optiboot ?
- Что отправляется на Arduino?
- Как это реагирует?
- Что значит «не синхронизировано»?
- Что такое "в синхронизации" в любом случае?
Примечание: это подразумевается как «справочный вопрос» .
arduino-uno
bootloader
Ник Гаммон
источник
источник
Ответы:
Когда вы перезагружаете Uno, на котором работает загрузчик Optiboot, загрузчик сначала мигает контактом 13 три раза.
Верхняя линия (серая) отправляется в в Arduino, средняя линия (оранжевая) отправляются из в Arduino.
Пока это происходит, программа,
avrdude
запущенная на вашем компьютере, отправляет запрос на устройство:Arduino не замечает первый «get sync», потому что он занят перепрошивкой контакта 13. Как только он это сделает, он замечает «get sync» (он будет буферизован последовательным оборудованием) и отвечает:
Похоже, что avrdude немного нетерпелив, и время истекло, потому что он пытается снова с запросом «получить синхронизацию». На этот раз Optiboot отвечает немедленно.
Остальная часть загрузки описана на следующем рисунке. Пример производится загрузкой стоковой программы «Blink».
(Нажмите на изображение выше для увеличения)
Шаги:
Установите параметры устройства. Следующие параметры устройства отправляются на чип:
Optiboot игнорирует все это и отвечает с помощью In Sync / OK. :)
Установить расширенные параметры устройства:
Optiboot также игнорирует все это и отвечает с помощью In Sync / OK.
Войдите в режим программирования. Ответ: Синхронизировано / ОК.
Читайте подпись. Optiboot отвечает,
0x1E 0x95 0x0F
фактически не читая подпись .Напишите предохранители (четыре раза). Optiboot не записывает предохранитель, а просто отвечает In Sync / OK.
Адрес загрузки (изначально 0x0000). Адрес указывается словами (т. Е. Слово составляет два байта). Это устанавливает адрес, по которому будет записана следующая страница данных.
Страница программы (отправляется до 128 байт). Optiboot немедленно отвечает «In Sync». Затем происходит пауза около 4 мс, пока она фактически программирует страницу. Затем он отвечает «ОК».
Адрес загрузки (сейчас 0x0040). Это адрес 64 в десятичном виде, т.е. 128 байт от начала памяти программы.
Другая страница написана. Эта последовательность продолжается до тех пор, пока не будут написаны все страницы.
Адрес загрузки (обратно до 0x0000). Это для проверки записи.
Страница чтения (читается до 128 байт). Это для проверки. Обратите внимание, что даже если проверка не удалась, неверные данные уже были записаны в чип.
Выйти из режима программирования.
Что значит «не синхронизировано»?
Как видно из вышеизложенного, на каждом шаге последовательности программирования Arduino должен отвечать «In Sync» (0x14), возможно, после некоторых данных, а затем «OK» (0x10).
Если он «не синхронизирован», это означает, что avrdude не получил ответ «in sync». Возможные причины могут быть:
Что такое "синхронно"?
Как упоминалось выше, ответ «In sync» означает, что Arduino (загрузчик) синхронизирован с загружаемой программой.
Какой протокол используется?
Протокол является протоколом STK500, задокументированным Atmel. Смотрите ссылки ниже.
Ссылки
Примечание : STK500 версии 2 не используется в Optiboot, но он включен для информации, если вы используете платы, такие как Mega2560.
Константы STK500
источник
avrdude
поведение проверки по умолчанию, является загрузчиком, который поддерживает считывание содержимого флэш-памяти.