Можно ли загрузить скетч Arduino через последовательный порт (RX) вместо USB?

Другими словами, можно ли разработать собственный загрузчик, чтобы скетчи можно было загружать через последовательное соединение, выполненное с использованием контактов RX/TX, а не через разъем USB (я использую платы Pro Micro)? Спасибо!

, 👍1

Обсуждение

Это определенно возможно. Загрузчик — это просто программа, которая может связываться с любым доступным оборудованием, записывать память и переходить к ней., @Eugene Sh.

Это должно быть возможно путем адаптации последовательного загрузчика, обычно используемого в ATmega328p (и т. д.), к вашему ATmega32u4. Однако подробности этого не совсем подходят для вопроса на сайте Stack Exchange *если вы не объясните конкретную трудность*. Обязательно поищите, вполне возможно, что кто-то уже реализовал этот проект. Также подумайте, может ли переход на плату типа Arduino, которая просто имеет ATmega328p (особенно компактную без второго чипа в качестве USB-моста, хотя вы можете обойти это), самым простым способом удовлетворить ваши потребности., @Chris Stratton


3 ответа


1

Да. Вы можете разработать загрузчик для ATmega32u4, который будет получать прошивку через любой интерфейс (UART, SPI, I2C и т. д.).

Загрузка через UART — решаемая проблема. Найдите загрузчик AVR109.

,

1

Да, существует форк Optiboot, поддерживающий ATmega32U4, поддерживающий аппаратный UART для загрузки скетчей Arduino.

Кроме того, подробная инструктивная публикация, объясняющая, как использовать это с помощью Arduino Pro Micro.

,

6

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

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

Таким образом, вы можете отправлять данные, используя прямое соединение или, например, Bluetooth, например HC-05. Я делаю это для какого-то проекта, чтобы выполнить обновление через Android: приложение Android отправляет заказ на Arduino через Bluetooth. Получив это, сам Arduino RESET, а затем приложение Android немедленно отправляют данные.

На стороне Arduino: подключите, например, A0 к PIN-коду RESET и выполните digitalWrite(PIN_RESET,HIGH); Также ознакомьтесь с Сброс кода Arduino Uno

После СБРОСА плата ответит 0x14 0x10 (поэтому она отправит это в TX, и поэтому, если у вас есть модуль Bluetooth, вы получите это в своем приложении Android (например))

Затем вы должны отправить на плату 0x50 0x20, чтобы сообщить ей, что вы вошли в режим программирования. Затем отправьте 0x75 0x20, чтобы получить идентификатор платы, чтобы быть уверенным, что вы отправите HEX-файл для правильного оборудования. Вы получите 0x14 XXX 0x10, где XXX = идентификатор платы

Затем вы можете отправить HEX-файл.

Для этого вы будете отправлять его блоками по 128 байт

Итак, начните с деления HEX, чтобы узнать количество блоков, а затем выполните цикл по этому числу: Начните с ADR=0 (адрес назначения во флэш-памяти) и отправьте:

Для каждого блока:

1) Отправьте 0x55, младший байт ADR, старший байт ADR, 0x20

2) проверьте ответ (должен быть 0x14 0x10)

3) Отправьте 128 байт: 0x64, 0x00, 0x80, 0x46, затем 128 байт и закончите 0x20 (0x80 – это размер)

4) проверьте ответ (должен быть 0x14 0x10)

5) обновить ADR. Будьте осторожны: ADR — это указатель на слово (2 байта). Таким образом, ADR = ADR+0X40

Цикл по количеству блоков

Завершите задание, отправив 0x51 0x20 (выход из режима программирования)

Некоторые подробности:

  • 0x46 перед 128 байтами говорит о том, что вы хотите записать во флэш-память. Доступны и другие коды, например, для проверки, получения данных и т. д.

    • Кажется обязательным отправлять каждый раз 128 байт. Поэтому, если ваш последний блок меньше, вам нужно добавить немного '\0', чтобы получить в общей сложности 128. Мне не удалось получить хорошие результаты, пытаясь изменить значение 0x80 и отправить меньше байтов. :(

Это не очень просто, и для получения хорошего кода нужны тесты, но очень хорошо иметь возможность обновлять Arduino, которую пользователь может обновить.

Надеюсь, это поможет.

,