I'm trying to flash pure c-code to arduino Mega2560 board from linux using avr-gcc & avrdude. Compilation is done , now trying to flash using avr-dude, getting error as "avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00"

I used below command to produce hex file

avr-gcc -mmcu=atmega2560 -DF_CPU=16000000UL led.c -o led.elf

In file included from led.c:3:0: /usr/lib/avr/include/util/delay.h:95:3: warning: #warning "Compiler optimizations disabled; functions from won't work as designed" [-Wcpp] # warning "Compiler optimizations disabled; functions from won't work as designed"

And then

avr-objcopy -j .text -O ihex led.elf led.hex

finally for flashing

avrdude -F -V -c arduino -p ATMEGA2560 -P /dev/ttyACM3 -b 115200 -U flash:w:led.hex

FYI: port is correct & RX pin is blinking i.e connection is perfect between computer & board

  • One note: -DF_CPU=1000000UL is 1MHz. I'm pretty sure Arduino Mega2560 runs on 16MHz. Anyway, you can try to use PlatformIO CLI (I'm using it on Linux machine and it works fine with several different Arduinos) – KIIV May 21 '17 at 7:41
  • @KIIV , even @ 16Mhz , same probelm. any idea how to do without PlatformIO CLI? – sankar May 21 '17 at 8:24
  • Try prefixing your avrdude command with stty -F /dev/ttyACM3 hupcl && – Majenko May 21 '17 at 11:49

In file included from led.c:3:0: /usr/lib/avr/include/util/delay.h:95:3: warning: #warning "Compiler optimizations disabled; functions from won't work as designed"

You should start by fixing this. Simply add -Os to the compiler command line. This means “optimize for size”, and is the standard optimization option used with Arduinos.

avr-objcopy -j .text -O ihex led.elf led.hex

If your copy of avrdude was compiled with libelf (like the one supplied with Ubuntu is), you don't need this: you can hand your elf file directly to avrdude.

avrdude -F -V -c arduino -p ATMEGA2560 -P /dev/ttyACM3 -b 115200 -U flash:w:led.hex

-F tells avrdude to not verify the device signature. -V tells it to not verify the upload. I wouldn't use any of these options unless I had a very good reason to do so. -c arduino is wrong: it selects the upload protocol used by optiboot (used, e.g., in the Uno). The Mega 2560 uses a different bootloader based on the “wiring” protocol. I would also add the -D option (disable auto erase) because I saw the Arduino IDE using it, and because without this option I get the error:

avrdude: erasing chip
avrdude: stk500v2_command(): command failed

In the end, the upload command ends up being something like:

avrdude -p atmega2560 -c wiring -P /dev/ttyACM3 -b 115200 -D -U led.elf
  • thanks ! it is working. your explanation is clear. I'm new to avr, can you please direct me where to learn all those? @Edgar Bonet – sankar May 22 '17 at 15:58
  • 1
    @sankar: I don't have a good reference handy for that. I learned it the hard way, by looking at how the Arduino IDE and Sudar Muthu's Makefile do it, and by reading the man page of avrdude. – Edgar Bonet May 22 '17 at 16:02

I'm trying to flash pure c-code

you cannot flash any C-code to any arduino, pure or not pure. the arduino only takes binary code.

with that said, the arduino compiler is capable of translating any pure C-code to binary, to the extent that you can write pure C-code.

So once you have an arduino toolchain, you basically have had all necessary tools to write pure C-code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.