Не удается заставить "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 все еще нет загрузчика. Я хотел бы исправить эту проблему, потому что уверен, что в будущем мне захочется обновить / изменить свое приложение. Таким образом, теперь возникает вспомогательный вопрос - то есть можно ли записать загрузчик, не стирая уже существующее приложение? - Ответ, я думаю, нет, потому что, может быть, вам нужно сделать стирание чипа перед записью в область загрузчика?

, 👍2

Обсуждение

Уважаемый 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


1 ответ


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

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