Как запрограммировать Arduino вручную через STK500?

Я пытаюсь запрограммировать Arduino Nano (с ATmega328P) с ESP32, который подключен к его UART и контакту сброса. Я должен сделать это через ESP, потому что Arduino должен работать сам по себе, отдельно от ПК (где я мог бы использовать для этого существующий программатор). Но его программа должна быть изменяемой, следовательно, она подключена к ESP, который доступен с веб-сервера через Wi-Fi, так что Arduino можно перепрограммировать по запросу. Я почти разобрался со всей настройкой: сервер запущен, файлы могут быть отправлены на ESP, а ESP может взаимодействовать с загрузчиком Arduino. Единственная проблема заключается в том, что я не могу заставить Arduino выполнять новые программы.

Вся процедура проходит следующим образом: сервер связывается с ESP, отправляет шестнадцатеричный файл скетча Arduino (который успешно проверяется контрольной суммой, поэтому эта часть работает правильно). Затем ESP нажимает на вывод сброса Arduino и некоторое время ждет, прежде чем попытается связаться со своим загрузчиком. Затем он в основном выполняет ту же последовательность команд STK500, что и avrdude.

Я действительно просто скопировал команды из журнала avrdude после выполнения

avrdude -c arduino -vvvvv -p m328p -b 57600 -P /dev/ttyUSB0 -U flash:w:sketch.hex:i

и пропускать команды запроса, например, какую версию прошивки он использует и т.д. Итак, в основном: войдите в режим программирования, удалите чип, повторно войдите в режим программирования, запишите шестнадцатеричный файл во flash, начиная с адреса 0, двигаясь с шагом 128 байт (используя 1, чтобы заполнить последнее сообщение до полного размера 128 байт).). Затем после считывания файла с Arduino и проверки соответствия всех байтов (что они и делают!) и выхода из режима программирования (что является самым последним, что происходит в журнале avrdude). После этого я запускаю сброс настроек. Я использую точно такой же тип файла, который я передал avrdude, и все ответы загрузчика Arduino точно соответствуют значениям из журнала avrdude.

Но в то время как Arduino просто начинает выполнять скетч после этой процедуры при использовании avrdude, в моей собственной реализации он просто мигает своим светодиодом через регулярные промежутки времени (когда тестовый скетч должен заставить его мигать коротко, долго, коротко, долго и т.д.). Я не понимаю, что здесь происходит не так. Я подумал, что мигание может представлять собой код ошибки, но я не смог найти никакой документации по этому поводу. У меня такое чувство, что я обыскал весь Интернет (включая arduino stackexchange), и я даже просмотрел исходный код avrdude, чтобы проверить, сделано ли что-то еще после последней команды STK500, которая не указана в ее журнале. Я чувствую (надеюсь), что я очень близок к тому, чтобы это заработало, и все это нужно просто исправить в одну строку, но я больше не знаю, что еще попробовать, и был бы очень признателен за второе мнение от кого-то более опытного.

, 👍1

Обсуждение

В вашей заявленной последовательности программирования я не вижу, где вы сбрасываете микросхему AVR., @jwh20

Вы должны сбросить чип после программирования., @Majenko

Извините, я забыл упомянуть об этом. Я попытался сбросить его через ESP, а также вручную с помощью кнопки. Но, похоже, это ничего не меняет., @programonkey

@programonkey В этом случае я думаю, что единственная оставшаяся возможность заключается в том, что вы неправильно программируете код AVR, используя свой ESP32. На данный момент вы даете нам высокоуровневое описание того, что вы делаете, и это звучит правильно, но вы просите детальную оценку вашей проблемы, но не предоставляете такого уровня детализации. Я думаю, что ваш следующий шаг, чтобы получить помощь здесь, - это опубликовать вашу схему и ваш код., @jwh20

Вы используете какой-то переключатель уровней? Помните, что Arduino - 5 В, а ESP32 - 3 на 3, я не думаю, что это должно быть проблемой, но может быть :-), @k.Cyborg

Нет, я не использую переключатель уровней, но спасибо за подсказку. :), @programonkey

Объединение существующего программиста через сеть - интересная идея, но мое приложение требует определенного уровня децентрализации, который был бы разрушен этим решением., @programonkey


1 ответ


Лучший ответ:

1

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

РЕДАКТИРОВАТЬ: Вот код предварительной обработки из моего скрипта Python3:

import codecs

program = b''
for line in open('sketch.hex', 'rb'):
    program += codecs.decode(line[9:-4], 'hex')
,

итак, вопрос без кода, ответ без кода. никто не смог бы ответить на ваш вопрос, если бы проблема была в коде, который вы не показали. как это должно быть полезно в качестве вопросов и ответов? пожалуйста, добавьте код или удалите вопрос, @Juraj

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

теперь я понимаю, чем ты занимаешься. было бы проще работать с двоичным файлом скетча, а не с шестнадцатеричным файлом. https://github.com/jandrassy/ArduinoOTA/blob/2a591d028c5384849cdaf4ee7398b97b528bc054/extras/avr/platform.local.txt#L4, @Juraj

Да, так было бы лучше. Но поскольку изначально я не знал, как это сделать, я просто следовал некоторым онлайн-примерам и пытался максимально точно имитировать результирующее поведение avrdude. Теперь я стал умнее., @programonkey