Что происходит, когда код загружается с помощью загрузчика?

Когда я загружаю новый эскиз в свой Arduino Uno с помощью загрузчика Optiboot, что действительно ?

  • Что отправлено в Arduino?
  • Как он реагирует?
  • Что означает «не в синхронизации»?
  • Что такое «синхронно»?

Примечание. Это подразумевается как «ссылочный вопрос» .

9 голосов | спросил Nick Gammon 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2015 06:15:53 +0300 2015, 06:15:53

1 ответ


16

Когда вы перезагружаете Uno, запускающий загрузчик Optiboot, загрузчик сначала три раза мигает контакт 13.

 Пинк 13 мигает

Верхняя строка (серый) отправляется в , средняя строка Arduino (оранжевая) отправляется из Arduino.

Пока это происходит, программа avrdude, запущенная на вашем компьютере, отправляет запрос на устройство:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino не замечает первую «синхронизацию», потому что он занят мигающим выводом 13. После этого он замечает «получить синхронизацию» (он будет буферизирован серийным аппаратным обеспечением) и отвечает:

STK_INSYNC / STK_OK (0x14/0x10)

Похоже, что avrdude получил немного нетерпеливое и время ожидания, потому что он снова пытается выполнить запрос «получить синхронизацию». На этот раз Optiboot отвечает немедленно.


Остальная часть загрузки описана на следующем изображении. Пример: выгрузка программы «Blink».

 Процесс загрузки Optiboot

(Нажмите на изображение выше для большей версии)


Шаги:

  • Запрос: получить синхронизацию? Ответить: В Sync.
  • Запрос: Получить параметр? (основная версия) Ответ: версия 4.
  • Запрос: Получить параметр? (младшая версия) Ответ: версия 4.
  • Задайте параметры устройства. На микросхему отправляются следующие параметры устройства:

    0x42  // STK_SET_DEVICE
    0x86  // device code
    0x00  // revision
    0x00  // progtype: “0” – Both Parallel/High-voltage and Serial mode
    0x01  // parmode: “1” – Full parallel interface
    0x01  // polling: “1” – Polling may be used
    0x01  // selftimed: “1” – Self timed
    0x01  // lockbytes: Number of Lock bytes.
    0x03  // fusebytes: Number of Fuse bytes
    0xFF  // flashpollval1
    0xFF  // flashpollval2
    0xFF  // eeprompollval1
    0xFF  // eeprompollval2
    0x00  // pagesizehigh
    0x80  // pagesizelow
    0x04  // eepromsizehigh
    0x00  // eepromsizelow
    0x00  // flashsize4
    0x00  // flashsize3
    0x80  // flashsize2
    0x00  // flashsize1
    0x20  // Sync_CRC_EOP
    

    Optiboot игнорирует все те и отвечает с помощью In Sync /OK. :)

  • Задайте параметры расширенного устройства:

    0x45  // STK_SET_DEVICE_EXT
    0x05  // commandsize: how many bytes follow
    0x04  // eeprompagesize: EEPROM page size in bytes.
    0xD7  // signalpagel: 
    0xC2  // signalbs2: 
    0x00  // ResetDisable: Defines whether a part has RSTDSBL Fuse 
    0x20  // Sync_CRC_EOP
    

    Optiboot игнорирует все те , а также отвечает In Sync /OK.

  • Войдите в программный режим. Ответить: В Sync /OK.

  • Прочитайте подпись. Optiboot отвечает 0x1E 0x95 0x0F без фактического чтения подписи .

  • Записать предохранители (четыре раза). Optiboot не записывает плавкий предохранитель , а просто отвечает в Sync /OK.

  • Адрес загрузки (изначально 0x0000). Адрес находится в словах (т. Е. Слово равно двум байтам). Это задает адрес, где будет записываться следующая страница данных.

  • Страница программы (отправляется до 128 байт). Optiboot немедленно отвечает «In Sync». Затем происходит пауза около 4 мс, пока она фактически программирует страницу. Затем он отвечает «ОК».

  • Загрузить адрес (теперь 0x0040). Это адрес 64 в десятичной форме, т.е. 128 байт от начала памяти программы.

  • Написана другая страница. Эта последовательность продолжается до тех пор, пока не будут записаны все страницы.

  • Загрузите адрес (обратно в 0x0000). Это для проверки записи.

  • Страница чтения (считывается до 128 байтов). Это для проверки. Обратите внимание, что даже если проверка завершилась неудачно, плохие данные уже были записаны в чип.

  • Оставьте режим программирования.


Что означает «не в синхронизации»?

Как вы можете видеть из вышесказанного, каждый шаг в последовательности программирования, как ожидается, ответит Arduino с помощью «In Sync» (0x14), возможно, за которым последуют некоторые данные, а затем «OK» (0x10).

Если он «не синхронизирован», это означает, что avrdude не получил ответ «синхронно». Возможными причинами могут быть:

  • Используется неверная скорость передачи
  • Неверный последовательный порт, выбранный в IDE
  • Неверный тип платы, выбранный в среде IDE
  • Не установлен загрузчик
  • Установлен неправильный загрузчик
  • Совет не настроен на использование загрузчика (в плавких предохранителях)
  • Некоторое устройство подключено к контактам D0 и D1 на Arduino, мешая последовательным сообщениям
  • Чип интерфейса USB (ATmega16U2) не работает должным образом
  • Неправильные часы для платы
  • Неправильные настройки плавких предохранителей на Atmega328P (например, деление на 8 ")
  • Повреждение платы /чипа
  • Неисправный USB-кабель (некоторые кабели USB обеспечивают только питание ине для данных, например. дешевые кабели для USB-вентиляторов)

Что такое «синхронно»?

Как упоминалось выше, ответ «In sync» означает, что Arduino (загрузчик) синхронизирован с программой загрузки.


Какой протокол используется?

Протокол является протоколом STK500, как описано в Atmel. См. Ссылки ниже.


Ссылки

Примечание : STK500 Version 2 не используется в Optiboot, но он включен для информации, если вы используете доски, такие как Mega2560.


Константы STK500

 /* STK500 constants list, from AVRDUDE */
#define STK_OK              0x10
#define STK_FAILED          0x11  // Not used
#define STK_UNKNOWN         0x12  // Not used
#define STK_NODEVICE        0x13  // Not used
#define STK_INSYNC          0x14  // ' '
#define STK_NOSYNC          0x15  // Not used
#define ADC_CHANNEL_ERROR   0x16  // Not used
#define ADC_MEASURE_OK      0x17  // Not used
#define PWM_CHANNEL_ERROR   0x18  // Not used
#define PWM_ADJUST_OK       0x19  // Not used
#define CRC_EOP             0x20  // 'SPACE'
#define STK_GET_SYNC        0x30  // '0'
#define STK_GET_SIGN_ON     0x31  // '1'
#define STK_SET_PARAMETER   0x40  // '@'
#define STK_GET_PARAMETER   0x41  // 'A'
#define STK_SET_DEVICE      0x42  // 'B'
#define STK_SET_DEVICE_EXT  0x45  // 'E'
#define STK_ENTER_PROGMODE  0x50  // 'P'
#define STK_LEAVE_PROGMODE  0x51  // 'Q'
#define STK_CHIP_ERASE      0x52  // 'R'
#define STK_CHECK_AUTOINC   0x53  // 'S'
#define STK_LOAD_ADDRESS    0x55  // 'U'
#define STK_UNIVERSAL       0x56  // 'V'
#define STK_PROG_FLASH      0x60  // '`'
#define STK_PROG_DATA       0x61  // 'a'
#define STK_PROG_FUSE       0x62  // 'b'
#define STK_PROG_LOCK       0x63  // 'c'
#define STK_PROG_PAGE       0x64  // 'd'
#define STK_PROG_FUSE_EXT   0x65  // 'e'
#define STK_READ_FLASH      0x70  // 'p'
#define STK_READ_DATA       0x71  // 'q'
#define STK_READ_FUSE       0x72  // 'r'
#define STK_READ_LOCK       0x73  // 's'
#define STK_READ_PAGE       0x74  // 't'
#define STK_READ_SIGN       0x75  // 'u'
#define STK_READ_OSCCAL     0x76  // 'v'
#define STK_READ_FUSE_EXT   0x77  // 'w'
#define STK_READ_OSCCAL_EXT 0x78  // 'x'
ответил Nick Gammon 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2015 06:15:53 +0300 2015, 06:15:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132