проблемы с прошивкой avrdude
Я хочу записать шестнадцатеричный файл на пользовательскую плату ATmega2560. Я использую этот программатор USBasp для перепрошивки (версия прошивки 1.01) в моей системе Mac OS X 10.12.6. Все шестнадцатеричные файлы скомпилированы с помощью avr-gcc (GCC) 4.9.2.
Я использую эту команду для записи фьюзов (без загрузчика):
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega2560 -cusbasp -Pusb -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xfd:m -s -F
Что работает нормально: я могу прошивать программы меньшего размера (43 266 байт), и они сразу работают без загрузчика. Если я прошиваю большие программы (99 986 байт), они не запускаются. Я могу проверить, запускается ли программа, потому что они выплевывают данные через TTL. Меньшая программа работает, но большая ничего не производит.
Я включил "Проверка кода" и вижу небольшие программы:
avrdude: 43264 bytes of flash verified
большие программы:
avrdude: verification error, first mismatch at byte 0x0001
0x90 != 0x94
avrdude: verification error; content mismatch
Есть какие-нибудь намеки на эту сторону?
Во-вторых: после удаления всей прошивки, когда я прошиваю пользовательский загрузчик (из Atmel Studio - предохранители Ext. 0xFD, High: 0xD2, Low: 0xFF), команда:
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega2560 -cusbasp -Pusb -U flash:w:ATmega_Example.hex:i
и после чтения флэш-памяти загрузчик оказался в нескольких блоках во флэш-памяти.
Из считанного шестнадцатеричного файла (блоки данных):
Строка 1
>:20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
Вся флэш-память 0xFF до строки 1921
:20F0000077C000009BC0000099C0000097C0000095C0000093C0000091C000008FC0000066
Еще немного данных до строки 1995.
:20F940000895F894FFCF65300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31
Вся флэш-память 0xFF до строки 3970.
:20F0000077C000009BC0000099C0000097C0000095C0000093C0000091C000008FC0000066
Еще немного данных до строки 4044.
:20F940000895F894FFCF65300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31
И так далее... Я могу найти похожие данные 4 раза в файле.
Это проблема с перепрошивкой или со чтением данных с чипа?
Дайте мне знать, если вам нужна дополнительная информация, чтобы помочь мне здесь.
@jblaze, 👍-1
Обсуждение3 ответа
Лично я использую AVRDUDESS для загрузки скетча на atmega328p и attiny85. Попробуйте использовать его и запустить обнаружение. Я отвечаю на это, потому что AVRDUDESS очень прост в использовании и может помочь вам показать больше информации о вашей ошибке. Я думаю, что у вас может быть плохая проводка или неисправный кабель.
Я не уверен, что это решит вашу проблему, но несколько лет назад у меня была аналогичная проблема. Я пытался загрузить программу на ATTiny13A, используя дешевый e-bay USPasp, и получил ошибки проверки. Одним из шагов моего решения было изменение идентификатора программиста с «-c usbasp
» на «-c usbasp-clone
»
Подробнее здесь: https://www.nongnu.org/avrdude/user-manual/avrdude_4. HTML
Я знаком с этой проблемой. У меня не USBasp, а USBtinyISP, но я думаю, что проблема та же самая.
USBtinyISP не может читать или записывать больше 64 КБ. Поскольку AVR — это 8-битные машины с 16-битной адресацией, они не могут самостоятельно адресовать более 64 КБ. Специальная схема адресации используется во время выполнения, а также во время флэш-памяти. (Я думаю, что во время прошивки размер страницы был больше.)
Мне удалось обойти эту проблему, используя оригинальный Atmel AVRISP mkII.
- Поддерживают ли чипы ATMega 328/2560 JTAG-программатор и аппаратный отладчик?
- Странное явление с avrdude: stk500v2_ReceiveMessage(): таймаут только с ATmega250 на windows 7x64
- AVRdude неправильно считывает значения байтов предохранителя
- Понимание процесса компиляции/связывания/загрузки (поэтому мне не нужно использовать IDE)
- программирование ардуино на чистом с
- Проблема с загрузкой прошивки платы Melzi 2.0
- avr-g++ (или avr-gcc) и библиотека LiquidCrystal
- Как передать нестатический член класса для обратного вызова на платформах avr?
какие-либо изменения при использовании флага -D?, @neu-rah
никаких изменений, когда я прошиваю с опцией "-D", @jblaze
Определите «меньше» и «больше» по размеру кода., @Ignacio Vazquez-Abrams
маленький: 43,266 байт большой: 99,986 байт, @jblaze
Я добавил информацию для проверки. При больших проблемах это не удается: avrdude: ошибка проверки, первое несоответствие в байте 0x0001 0x90 != 0x94 avrdude: ошибка проверки; несоответствие содержания, @jblaze
Может ли ограничение размера быть 65 536 байт? IIRC, возникла проблема с адресами длиннее 16 бит, требующими специального расширения обычного протокола загрузки. Но я не помню, был ли предел размера 2 ^ 16 байт или 2 ^ 16 16-битных слов., @Edgar Bonet