Не могу загрузить скетч на 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
Я понятия не имею, в чем проблема, и прошу любой помощи.
Большое спасибо, Александр.
1 ответ
Наконец-то я решил проблему. Я использовал программатор 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.
Эта проблема не зависит от ОС ПК. ;-) Я использую Arch-Linux и использую Arduino IDE, а также avrdude напрямую. Нужно знать, какие опции использовать, вот в чем секрет. Как всегда. :-D, @the busybee
*"но в наши дни платы Arduino поставляются с загрузчиком urboot"*
Чтобы было ясно, это не относится к официальным Arduino на базе AVR или их верным клонам. Текущий официальный пакет платы AVR 1.8.7 даже не поставляется с достаточно новой версией avrdude для поддержки -c urclock
.
Если кому-то это нужно, похоже, что различные пакеты [MCUdude](https://github.com/MCUdude) будут поддерживать -c urclock
, MiniCore или MightyCore и т. д., @timemage
- Мой Arduino UNO включает светодиод навсегда когда я подключаю его к своему ноутбуку
- Не удается снова загрузиться после смены платы
- Arduino UNO для получения подписи чипа ATmega328P-PU
- Что означает avrdude: Device signature = 0x000000? Неисправная проводка? Проблема с программным обеспечением? Неправильная инструкция?
- Программирование ATMega328P без платы Arduino всегда возвращает ошибку: avrdude: stk500_recv(): programmer is not responding
- AVRdude неправильно считывает значения байтов предохранителя
- Загрузчик на ATmega328p (3.3V/8MHz), чувак не закончит свое дело
- Попытка понять узкое место частоты дискретизации датчика
Вы проверяли различные протоколы загрузчика, поскольку существуют их «разновидности»? Если это работает с вашим MacBook, вы смотрели эту командную строку? (В Arduino IDE 1 есть опция включения журнала загрузки.), @the busybee
Привет @thebusybee! Спасибо, что заинтересовались моей проблемой. Да, я только что попробовал другой программатор, и мой скетч успешно загрузился. Поэтому я опубликую свой собственный ответ на этот вопрос., @Alexander Perechnev
Посмотрите, может это поможет: https://forum.arduino.cc/t/cannot-upload-sketch-to-arduino-uno/1220498, @tepalia