Не могу загрузить скетч на Arduino Uno с помощью avrdude

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

Моя конфигурация оборудования и программного обеспечения:

  • FreeBSD-14.0-RELEASE
  • Arduino Uno R3 с чипом Atmega16u2 USB-to-Serial
  • avrdude 7.2

Скетч просто пустой и компилируется без проблем:

#include <Arduino.h>
void setup() {}
void loop() {}

Мой вывод kldstat:

aperechnev@home-pc:~/Projects/stepper-test $ kldstat 
Id Refs Address                Size Name
 1   45 0xffffffff80200000  1d34598 kernel
 2    1 0xffffffff81f35000     7718 cryptodev.ko
 3    1 0xffffffff81f3d000     4370 uarduno.ko
 4    2 0xffffffff81f42000     a088 ucom.ko
 5    1 0xffffffff81f4e000   5d51c8 zfs.ko
 6    1 0xffffffff82524000   daa430 nvidia.ko
 7    3 0xffffffff832cf000    1e6a8 linux_common.ko
 8    2 0xffffffff832ee000    6a068 linux.ko
 9    1 0xffffffff83c20000     3250 ichsmb.ko
10    1 0xffffffff83c24000     2178 smbus.ko
11    1 0xffffffff83c27000     2a68 mac_ntpd.ko
12    1 0xffffffff83c2a000    12e08 fusefs.ko
13    1 0xffffffff83c3d000     4d64 geom_uzip.ko

Краткое описание проблемы: avrdude: ser_recv(): программатор не отвечает.

Сейчас я раскрываю подробное описание.

Я загружаю свой эскиз с помощью следующей команды:

avrdude -v -v -v -v -p atmega328p -c arduino -b 115200 -P /dev/cuaU0 -U flash:w:/home/aperechnev/Projects/stepper-test/firmware.hex:i

И я получаю следующий вывод:

avrdude: Version 7.2
         Copyright the AVRDUDE authors;
         see https://github.com/avrdudes/avrdude/blob/main/AUTHORS

         System wide configuration file is /usr/local/etc/avrdude.conf
         User configuration file is /home/aperechnev/.avrduderc
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cuaU0
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: send: 0 [30]   [20] 
avrdude: send: 0 [30]   [20] 
avrdude: send: 0 [30]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         Serial program mode           : yes
         Parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom                 65    20     4    0 no       1024    4      0  3600  3600 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           flash                  65    10   128    0 yes     32768  128    256  4500  4500 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lfuse                   0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           hfuse                   0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           efuse                   0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lock                    0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           signature               0     0     0    0 no          3    1      0     0     0 0x00 0x00
                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           calibration             0     0     0    0 no          1    1      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino for bootloader using STK500 v1 protocol
avrdude: send: A [41] . [80]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [03] 
avrdude: recv: . [10] 
avrdude: send: A [41] . [81]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [04] 
avrdude: recv: . [10] 
avrdude: send: A [41] . [82]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [04] 
avrdude: recv: . [10] 
avrdude: send: A [41] . [98]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [03] 
avrdude: recv: . [10] 
         Hardware Version: 3
         Firmware Version: 4.4
avrdude: send: A [41] . [81]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [04] 
avrdude: recv: . [10] 
avrdude: send: A [41] . [82]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [04] 
avrdude: recv: . [10] 
avrdude: send: B [42] . [86] . [00] . [00] . [01] . [01] . [01] . [01] . [03] . [00] . [00] . [00] . [00] . [00] . [80] . [04] . [00] . [00] . [00] . [80] . [00]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
avrdude: send: E [45] . [05] . [04] . [d7] . [c2] . [01]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
avrdude: send: P [50]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
avrdude: AVR device initialized and ready to accept instructions
Reading |                                                    | 0% 0.00 s 
avrdude: send: u [75]   [20] 
avrdude: recv: . [14] . [1e] . [95] . [0f] . [10] 
Reading | ################################################## | 100% 0.00 s 
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: send: V [56] . [ac] . [80] . [00] . [00]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [00] 
avrdude: recv: . [10] 
avrdude: send: A [41] . [81]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [04] 
avrdude: recv: . [10] 
avrdude: send: A [41] . [82]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [04] 
avrdude: recv: . [10] 
avrdude: send: B [42] . [86] . [00] . [00] . [01] . [01] . [01] . [01] . [03] . [00] . [00] . [00] . [00] . [00] . [80] . [04] . [00] . [00] . [00] . [80] . [00]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
avrdude: send: E [45] . [05] . [04] . [d7] . [c2] . [01]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
avrdude: send: P [50]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 

avrdude: processing -U flash:w:/home/aperechnev/Projects/stepper-test/firmware.hex:i
avrdude: reading input file /home/aperechnev/Projects/stepper-test/firmware.hex for flash
         with 3472 bytes in 1 section within [0, 0xd8f]
         using 28 pages and 112 pad bytes
avrdude: writing 3472 bytes flash ...
Writing |                                                    | 0% 0.00 s 
avrdude: send: U [55] . [c0] . [06]   [20] 
avrdude: recv: . [14] 
avrdude: recv: . [10] 
avrdude: send: t [74] . [00] . [80] F [46]   [20] 
avrdude: recv: . [14] 
avrdude: ser_recv(): programmer is not responding
Writing | -------------------------------------------------- | 0% 5.05 s 
avrdude stk500_recv() [stk500.c:75] error: programmer is not responding

Как я вижу, avrdude успешно определяет мою плату, считывает ее конфигурацию и т. д. Но затем он не может прочитать ответ от платы сразу после того, как начинает загружать скетч.

Я посмотрел код загрузчика (Optiboot) и нашел строки, которые отвечают за обработку запроса 0x74, и похоже, что проблема не в загрузчике.

Более того, моя плата Arduino мигает светодиодами TX/RX, а также светодиодом L во время начала загрузки, на этапе, когда avrdude считывает ее конфигурацию.

И еще одна интересная вещь: некоторые скетчи успешно загружались, когда я нажимал кнопку RESET на своей плате Arduino во время загрузки. Но это происходило всего два раза. Я где-то читал об этом трюке на Stackoverflow, но очень сложно уловить момент, когда нужно нажать кнопку RESET.

И еще один интересный факт: мои скетчи без проблем загружаются с моего MacBook Pro под управлением MacOS и Arduino IDE 2.x. Так что я уверен, что плата не сгорела и загрузчик работает нормально.

И еще один важный факт — это вывод dmesg при подключении платы Arduino к USB-порту моего ПК:

ugen1.2: <Arduino Uno Arduino Uno> at usbus1
uarduno0 on uhub4
uarduno0: <Arduino Uno> on usbus1

Я понятия не имею, в чем проблема, и прошу любой помощи.

Большое спасибо, Александр.

, 👍3


1 ответ


2

Наконец-то я решил проблему. Я использовал программатор arduino в качестве параметра для avrdude ... -c arduino, но он не может работать с новыми платами Arduino. Он был написан для плат, которые используют optiboot в качестве загрузчика, но в наши дни платы Arduino поставляются с загрузчиком urboot. Поэтому, чтобы иметь возможность загружать скетчи на новые платы Arduino, вы должны использовать программатор urclock: avrdude ... -c urclock. И поскольку загрузчики могут различаться по размеру флэш-памяти, в которую они помещаются, вам также нужно передать параметр -xbootsize=<N> в avrdude, чтобы избежать переопределения загрузчика.

Итак, чтобы загрузить свой эскиз, вам нужно использовать что-то вроде:

avrdude ... -c urclock ... -xbootsize=1024 ...

Я собираюсь просмотреть существующие руководства и предложить некоторые дополнения, чтобы люди могли сэкономить свое время при работе с Arduino на FreeBSD, Linux и других платформах, кроме Windows или MacOS.

,