Linux avrdude: stk500_getsync()

При попытке прошить мой подлинный arduino micro с помощью avrdude из cmd в системе Manjaro я получаю печально известную ошибку

avrdude: stk500_getsync() попытка x из 10 ...

Я добавляю этот пост ко многим другим, которые спрашивают об этой ошибке, потому что все они пытаются использовать IDE для прошивки arduino, тогда как я могу использовать его без проблем как в Linux, так и в Windows, но при использовании avrdude из cmd в Linux я получаю эту ошибку. Это подтверждает, что плата в порядке, и на выводе сброса нет коротких замыканий или любой другой возможной физической причины этой проблемы, похоже, что-то не так в конфигурации avrdude.

Это мой Makefile:

default: build

build:
    avr-gcc -mmcu=atmega32u4 main.c -o main

flash:  
    avr-objcopy -O ihex -R .eeprom main main.hex
    avrdude -F -V -c arduino -p m32u4 -P /dev/ttyACM0 -b 115200 -U flash:w:main.hex

Можете ли вы в любом случае предложить, как это исправить?

Редактировать: Проблема решена!

Ошибка была в параметре -c, для atmega 32u4 это должен быть avr109, а не arduino.

, 👍3

Обсуждение

В среде IDE вы можете установить предпочтение подробному выводу при загрузке, а затем просмотреть журнал. В нем могут отображаться все команды, которые использует IDE., @the busybee


1 ответ


4

Существует два распространенных способа сброса Arduino в загрузчик:

  1. Для плат на базе UART (Uno, Mega2560 и т. Д.) Простое открытие порта сбрасывает плату
  2. Для плат на базе USB (Micro и т. Д. С чипом 32u4) Вы должны вручную указать ему сброс

Ваш вариант 2 - если вы не скажете ему сбросить плату, он ничего не сделает. Среда разработки обычно обрабатывает это за вас.

Но это просто: просто откройте порт CDC / ACM со скоростью 1200 бод и снова закройте. Самый простой способ - использовать stty, чтобы сделать это за вас:

stty -F /dev/ttyACM0 speed 1200

Вы должны обнаружить, что затем он сбрасывает плату. Добавление короткой задержки для сброса USB-порта тоже было бы неплохо. Таким образом, вся ваша процедура программирования может выглядеть примерно так:

flash:  
    avr-objcopy -O ihex -R .eeprom main main.hex
    stty -F /dev/ttyACM0 speed 1200
    sleep 1
    avrdude -F -V -c arduino -p m32u4 -P /dev/ttyACM0 -b 115200 -U flash:w:main.hex

В Makefiles я считаю полезным установить порт в качестве переопределяемой переменной:

PORT?=/dev/ttyACM0

Затем используйте ${PORT} везде вместо /dev/ttyACM0 - тогда вы можете использовать make PORT=/dev/ttyACM1, если вам нужно, без необходимости редактировать Makefile . Отлично, если у вас есть несколько плат.

,

Я действительно думал о перезагрузке, спасибо за объяснение! Когда я запускаю команду flash, я получаю следующее, а затем она останавливается, не продвигаясь дальше: `avr-objcopy -O ihex -R .eeprom main main.hex \ n stty -F / dev / ttyACM0 скорость 1200 \ n 9600 \ n` Что все это значит?, @Steve

Этот [Arduino Makefile](https://github.com/sudar/Arduino-Makefile ) поставляется с [небольшим скриптом] (https://github.com/sudar/Arduino-Makefile/blob/1.6.0/bin/ard-reset-arduino ), который делает именно это на микро, и имеет другую логику для других типов плат., @Edgar Bonet

@EdgarBonet Я пытаюсь изучить низкоуровневое программирование, вот почему я делаю это с помощью MakeFile, я не хочу использовать скрипт на python., @Steve