Не удается заставить "Burn Bootloader" работать - Arduino Nano
Это продолжение предыдущего вопроса. У меня есть один Nano, работающий отлично (я думаю) (Nano A) и еще один (Nano B), который, кажется, работает, но не имеет загрузчика. Поэтому я пытаюсь использовать Nano-A в качестве программатора ISP, чтобы записать загрузчик в Nano-B. Я довольно уверен в своем оборудовании и настройке Arduino IDE. Подробности см. в предыдущем вопросе; Проблемы с загрузкой с новым Nano
Я вставил ниже два сеанса экрана. Первый показывает журнал Arduino IDE, когда я (безуспешно) пытаюсь запустить "Burn Bootloader" - ОН почти работает! (но не совсем). - Поэтому я считаю, что в моей установке нет ничего плохого.
Второй сеанс - это запуск avrdude в режиме "терминал" из командной строки Windows. Я использовал отдельные команды "отправить" для отправки инструкций ISP, необходимых для программирования одного слова во флэш-память загрузчика, и все это, кажется, работает нормально. Поэтому я не понимаю, почему avrdude не работает при вызове IDE.
Arduino IDE Log (длинный)
C:\Users\--\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude -CC:\Users\--\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf -v -patmega328p -cstk500v1 -PCOM8 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDA:m -Ulfuse:w:0xFF:m
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Users\--\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
Using Port : COM8
Using Programmer : stk500v1
Overriding Baud Rate : 19200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : STK500
Description : Atmel STK500 Version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.11s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: erasing chip
avrdude: reading input file "0x3F"
avrdude: writing lock (1 bytes):
Writing | ################################################## | 100% 0.04s
avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x3F:
avrdude: load data lock data from input file 0x3F:
avrdude: input file 0x3F contains 1 bytes
avrdude: reading on-chip lock data:
Reading | ################################################## | 100% 0.04s
avrdude: verifying ...
avrdude: 1 bytes of lock verified
avrdude: reading input file "0xFD"
avrdude: writing efuse (1 bytes):
Writing | ################################################## | 100% 0.04s
avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xFD:
avrdude: load data efuse data from input file 0xFD:
avrdude: input file 0xFD contains 1 bytes
avrdude: reading on-chip efuse data:
Reading | ################################################## | 100% 0.04s
avrdude: verifying ...
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0xDA"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.04s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDA:
avrdude: load data hfuse data from input file 0xDA:
avrdude: input file 0xDA contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.04s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.04s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.04s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude done. Thank you.
C:\Users\--\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude -CC:\Users\--\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf -v -patmega328p -cstk500v1 -PCOM8 -b19200 -Uflash:w:C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr/bootloaders/optiboot/optiboot_atmega328.hex:i -Ulock:w:0x0F:m
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Users\--\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
Using Port : COM8
Using Programmer : stk500v1
Overriding Baud Rate : 19200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : STK500
Description : Atmel STK500 Version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.11s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr/bootloaders/optiboot/optiboot_atmega328.hex"
avrdude: writing flash (32768 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_cmd(): programmer is out of sync
avrdude: stk500_cmd(): programmer is out of sync
avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr/bootloaders/optiboot/optiboot_atmega328.hex:
avrdude: load data flash data from input file C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr/bootloaders/optiboot/optiboot_atmega328.hex:
avrdude: input file C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr/bootloaders/optiboot/optiboot_atmega328.hex contains 32768 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.00s
avrdude: loadaddr(): (b) protocol error, expect=0x14, resp=0xc0
avrdude: stk500_paged_load(): (a) protocol error, expect=0x14, resp=0x10
avrdude: stk500_cmd(): protocol error
avr_read(): error reading address 0x7e00
read operation not supported for memory "flash"
avrdude: failed to read all of flash memory, rc=-2
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0xd1
avrdude done. Thank you.
Error while burning bootloader.
avrdude сессия (короткая)
Обратите внимание, что при записи во флэш-память загрузчика, используя инструкцию "отправить", вы должны указать адрес в виде "слова" - то есть 16-битного адреса - следовательно, 0x3C00. При использовании инструкции "чтение" адрес является "байтовым" (8-битным) адресом, следовательно, 0x7800 - это один и тот же адрес.
Обновление: теперь мне удалось загрузить свой оригинальный скетч в область применения flash на этом Nano, используя опцию меню "Sketch-> upload using programmer" Arduino IDE. Таким образом, теперь у меня есть полезный Nano, но я до сих пор не решил свою первоначальную проблему, т.Е. У этого Nano все еще нет загрузчика. Я хотел бы исправить эту проблему, потому что уверен, что в будущем мне захочется обновить / изменить свое приложение. Таким образом, теперь возникает вспомогательный вопрос - то есть можно ли записать загрузчик, не стирая уже существующее приложение? - Ответ, я думаю, нет, потому что, может быть, вам нужно сделать стирание чипа перед записью в область загрузчика?
@Rob W, 👍2
Обсуждение1 ответ
Лучший ответ:
Ура! - Теперь у меня есть полностью работающий Nano с новым загрузчиком и загруженным приложением usinвведите код вот
так.
Я сделал так много, что не уверен, в чем заключалась первоначальная проблема, но окончательное изменение заключалось в изменении "programmers.txt " файл такой, что запись "Arduino as ISP" была изменена следующим образом;
Original line;
arduinoasisp.protocol=stk500v1
Changed to;
arduinoasisp.protocol=arduino
Я сделал это, потому что заметил, что опция меню "Загрузить с помощью программатора" (которая работала) вызывала avrdude с параметром "-c arduino", тогда как опция "записать загрузчик" использовала "-c stk500v1" (которая не работала).
Я не могу сказать, что полностью понимаю, но я счастлив, что теперь это работает и что теперь я узнал достаточно, чтобы знать, с чего начать искать, если у меня возникнут подобные проблемы в будущем.
Я должен также добавить, что я бы никогда не попал сюда без помощи @timemage, который очень помог - большое спасибо
Существуют различия между stk500v1 и "arduino" с точки зрения того, как явно обрабатывается сброс и как считываются подписи; в остальном они одинаковы. Я понятия не имею, почему это могло бы решить вашу проблему. Что же заставило вас попробовать это с самого начала?, @timemage
Я внимательно изучил журналы Arduino IDE - особенно вызовы avrdude - чтобы увидеть, что IDE делала по-разному между (1) "Загрузка с помощью программиста" (который работал) и (2) "Запись загрузчика" (который не работал) и заметил, что вызов "записать загрузчик" имел параметр "-c stk500v1"., @Rob W
Что ж, я рад, что хоть что-то работает. Но я скептически отношусь к тому, что само по себе является причиной и решением проблемы. Он терпит неудачу, а затем снова работает последовательно с изменением этой опции взад и вперед?, @timemage
Я подозреваю, что первоначальная проблема заключалась в том, что что-то было не так в поставляемой конфигурации дешевого китайского клона nano, который я купил на eBay. Я подозреваю, что он, возможно, был поставлен без загрузчика, но я не знаю этого наверняка. Поэтому я не могу вернуться к своей первоначальной отправной точке, если только не закажу еще один Nano у того же поставщика, что я мог бы сделать, просто ради удовольствия. За 3,00 фунта это может стоить того, чтобы просто доказать мою теорию. Я приобрел два других дешевых Нано-клона у других поставщиков, и у меня не было никаких проблем. Я разделяю ваш скептицизм., @Rob W
- Запись загрузчика завершается словами "avrdude done. Thank you.". но загрузчик на самом деле не прошивался
- avrdude ser_open() can't set com-state
- Не удается снова загрузиться после смены платы
- Тайм-аут связи Arduino Mega с ошибкой программатора
- Arduino Nano не отвечает, желтый светодиод быстро мигает
- ATtiny85 Digispark clones failing USB handshake - как их запрограммировать?
- Ошибка протокола avrdude/stk500
- Проблема с загрузкой скетча в Леонардо
Уважаемый timemage - еще раз, это действительно полезно, я попробую использовать адреса, которые вы предлагаете. Причина, по которой я сказал 0x7C00 (что, как я теперь понимаю, в любом случае неверно), заключается в том, что параметр hfuse равен 0xDA, который является двоичным 10111010, то есть биты "BOOTSZ" равны 01, что в соответствии с таблицей данных должно давать размер загрузчика в 1024 слова. Итак, правильный ли начальный адрес 0x3C00?, @Rob W
Хорошо, значит, это странно. Я попробовал это здесь просто для проверки на вменяемость. Хотя моя настройка немного отличается от вашей, у меня нет обычного nano для работы. Я использую UNO в качестве своей цели, но программирую его как nano. По сути, аппаратной разницы нет. Я могу подтвердить, что он отключает 0xDA, но помещает на него 512-байтовую программу optiboot. По-видимому, это в основном NOP-переход от настроенного вектора сброса в 0x3C00 к тому месту, где код загрузчика фактически начинается с того, что было бы вектором сброса UNO 0x3f00. В любом случае, это глупо, но это работает., @timemage
Еще раз спасибо - теперь я обновил свой вопрос, как было предложено. Теперь, когда я разобрался со своими адресами, я вижу, что команды avrdude "отправить" могут нормально записывать данные в область загрузчика. Так что мне начинает казаться, что моя проблема как-то связана с тем, как arduino IDE вызывает avrdude - теперь я рассмотрю это более внимательно., @Rob W
Покажите проводку, я думаю., @timemage
Я думаю, что если я смогу заставить avrdude использовать Nano A в качестве программиста ISP в режиме терминала, то разве это не доказывает, что проводка в порядке?, @Rob W
Это наводит меня на мысль, что все не так уж плохо, что она постоянно терпит неудачу., @timemage
Теперь я частично понимаю, почему предохранители устанавливаются для запуска области загрузчика на 0x7800 - я думаю, это потому, что Arduino IDE поддерживает несколько различных опций для загрузчиков nano. Наверное, это немного глупо., @Rob W