Arduino bootloader burning is the process of writing the small firmware program that lives in the Arduino’s flash memory and allows it to accept code uploads via USB. When this bootloader gets corrupted — or when you receive a blank ATmega chip — the board appears completely dead: the IDE throws “avrdude: stk500_getsync() attempt 1 of 10: not in sync” or similar errors, and nothing uploads. This guide covers everything you need to know to diagnose a bricked Arduino and burn a fresh bootloader to bring it back to life.
- What Is an Arduino Bootloader?
- Signs of a Corrupted Bootloader
- Tools Required for Bootloader Burning
- Method 1: Arduino as ISP (No Extra Hardware)
- Method 2: Using a USBasp Programmer
- Method 3: Direct avrdude Command Line
- Understanding AVR Fuse Bits
- Troubleshooting Common Errors
- Frequently Asked Questions
What Is an Arduino Bootloader?
The bootloader is a small program (512 bytes to 2 KB depending on the variant) that runs every time the Arduino powers on or resets. Its job is to check whether a new sketch is being uploaded via the serial port. If the bootloader detects the IDE’s upload handshake signal (a brief DTR pulse on the USB-serial bridge), it enters programming mode and receives the new sketch over serial. If no upload is detected within a timeout period (typically a few hundred milliseconds), it jumps to the main application stored in flash.
This architecture means you never need an external programmer to upload regular sketches — the bootloader handles it. The tradeoff is a slightly slower startup (bootloader timeout) and a small amount of flash consumed by the bootloader itself.
Bootloader Variants by Board
- Uno/Nano (ATmega328P): Optiboot (512 bytes, very fast, ~1s timeout)
- Mega 2560 (ATmega2560): STK500v2 bootloader (~8 KB)
- Leonardo (ATmega32U4): CDC bootloader (enters via double-reset)
- Pro Mini: Optiboot (same as Uno)
Signs of a Corrupted Bootloader
Before attempting bootloader repair, confirm that the bootloader is actually the problem. Common symptoms include:
- Upload fails with sync error:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00 - Board doesn’t respond at all: No port appears in Device Manager / Arduino IDE ports list (though this can also mean a USB-Serial chip failure)
- Power LED on but nothing works: The onboard power LED lights up, suggesting the 5V regulator is fine, but the chip doesn’t enumerate
- Sketch uploads but doesn’t run: avrdude completes successfully but the program never executes (very rare, usually a fuse bit issue)
- Fresh ATmega chip: Brand new chips from the factory have no bootloader and cannot be programmed via USB until one is burned
Rule out other causes first:
- Try a different USB cable (power-only cables without data lines are common failures)
- Try a different USB port or a powered USB hub
- Check that the correct board and port are selected in the Arduino IDE
- On Windows, verify the driver (CH340 or ATmega16U2 driver) is installed correctly
Tools Required for Bootloader Burning
Burning a bootloader requires a method of communicating with the AVR’s ICSP (In-Circuit Serial Programming) interface. This bypasses the bootloader entirely and speaks directly to the chip’s programming hardware. You’ll need one of the following:
Option A: Another Arduino Board (Free/Already Owned)
Any working Arduino (Uno, Mega, Nano) can be temporarily converted into an ISP programmer using the “ArduinoISP” sketch included in the Arduino IDE examples. No additional hardware required beyond jumper wires.
Option B: USBasp Programmer (₹150–300)
A dedicated AVR programmer chip based on USB. Plug it into the target Arduino’s ICSP header and it programs directly from your PC via avrdude. Faster and more reliable than the Arduino-as-ISP method.
Option C: AVRISP mkII or Arduino-compatible ISP
The official Atmel/Microchip AVRISP mkII is the gold standard but expensive. Various clones work equally well for hobbyist bootloader burning.
You’ll also need: the Arduino IDE installed, jumper wires (for Arduino-as-ISP method), and knowledge of the ICSP pinout.
Method 1: Arduino as ISP (No Extra Hardware)
This is the recommended approach if you have two Arduino boards — one working and one bricked. The working board acts as the programmer.
Step 1: Upload ArduinoISP to the Working Board
- Connect the working Arduino (the “programmer”) to your computer via USB
- In Arduino IDE, go to File → Examples → 11.ArduinoISP → ArduinoISP
- Select the correct board and port for the working programmer board
- Upload the sketch — this converts the working Arduino into an ISP programmer
Step 2: Wire the Two Boards Together
Connect the ICSP pins of the programmer to the target (bricked) board:
| Programmer Arduino Pin | Target Board ICSP Pin |
|---|---|
| 5V | VCC (ICSP pin 2) |
| GND | GND (ICSP pin 6) |
| Pin 10 | RESET (ICSP pin 5) |
| Pin 11 (MOSI) | MOSI (ICSP pin 4) |
| Pin 12 (MISO) | MISO (ICSP pin 1) |
| Pin 13 (SCK) | SCK (ICSP pin 3) |
ICSP header pinout (viewed from above, notch at top-right):
MISO [1] [2] VCC SCK [3] [4] MOSI RST [5] [6] GND
Step 3: Burn the Bootloader
- In the Arduino IDE, change the board selection to match the target board (e.g., “Arduino Uno” for an Uno target)
- Change the port to the programmer board’s USB port (do NOT change the port)
- Go to Tools → Programmer → Arduino as ISP
- Go to Tools → Burn Bootloader
- Wait 1–2 minutes. Success shows “Done burning bootloader.” in the IDE status bar
Method 2: Using a USBasp Programmer
A USBasp programmer provides a more reliable programming connection, especially for repeated bootloader burns or when programming standalone ATmega chips on a breadboard.
Setup on Windows
- Download and install the USBasp drivers using Zadig (select “WinUSB” driver for the USBasp device)
- Connect the USBasp to the target board’s ICSP header (6-pin 2×3 connector)
- The USBasp’s ICSP connector is labeled — connect VCC, GND, SCK, MOSI, MISO, and RESET to the corresponding target pins
Burning via Arduino IDE
- Select the target board type under Tools → Board
- Go to Tools → Programmer → USBasp
- Click Tools → Burn Bootloader
Burning via Command Line (avrdude)
avrdude -c usbasp -p atmega328p -U flash:w:optiboot_atmega328.hex:i -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m -U efuse:w:0x05:m
Method 3: Direct avrdude Command Line
Advanced users can burn bootloaders directly from the command line using avrdude without opening the Arduino IDE. This is useful for scripting, CI pipelines, or when the IDE doesn’t recognize your programmer.
Find the bootloader hex files in the Arduino IDE installation directory:
- Windows:
C:Program FilesArduinohardwarearduinoavrbootloaders - Linux:
/usr/share/arduino/hardware/arduino/avr/bootloaders/ - macOS:
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/bootloaders/
Example for ATmega328P (Uno/Nano) with Arduino-as-ISP on /dev/ttyUSB0:
avrdude -c stk500v1 -P /dev/ttyUSB0 -b 19200 -p atmega328p -U flash:w:optiboot_atmega328.hex:i -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m -U efuse:w:0x05:m
Understanding AVR Fuse Bits
Fuse bits are special one-time-configuration registers in AVR microcontrollers that control fundamental hardware behavior: clock source, clock speed, bootloader size, brown-out detection, and JTAG. Incorrect fuse bits are a common reason bootloader burning succeeds but the board still doesn’t work.
The most important fuse bits for Arduino:
- LFUSE (Low Fuse): Controls clock source. Arduino Uno should be 0xFF (external 16 MHz crystal). If set to use internal 8 MHz RC oscillator, the board can still be programmed but runs at wrong speed
- HFUSE (High Fuse): Controls bootloader size and reset behavior. 0xDE for standard Optiboot (256-word bootloader)
- EFUSE (Extended Fuse): Brown-out detection level. 0x05 = 2.7V BOD enabled
Warning: Incorrect fuse bits can “brick” an Arduino at the hardware level, requiring a high-voltage parallel programmer to recover. The most common mistake is accidentally setting the clock to an internal oscillator when the board has an external crystal. Always use a fuse bit calculator (e.g., engbedded.com/fusecalc) when setting fuses manually.
Troubleshooting Common Errors
“avrdude: stk500_recv(): programmer is not responding”
This usually means the wiring between programmer and target is incorrect, or the programmer board is not running the ArduinoISP sketch. Double-check all six ICSP connections and ensure the programmer board was successfully flashed before wiring.
“avrdude: initialization failed, rc=-1”
The target chip is not responding to the programming handshake. Possible causes: RESET line not connected, VCC not connected, target chip is damaged, or wrong SPI clock speed. Try adding the -B flag: -B 100 to slow down the SPI clock.
“Yikes! Invalid device signature.”
The device signature read from the chip doesn’t match what avrdude expects for the selected chip type. Either the wrong chip type is selected in the IDE, or the chip is genuinely defective. Add -F to force the operation (use with caution).
Bootloader burns successfully but upload still fails
Check that the auto-reset circuit is working. The DTR line from the USB-Serial chip should pulse the RESET pin briefly when an upload starts. Verify the 100nF capacitor between the CH340/ATmega16U2 DTR pin and the ATmega RESET pin is present. On clones, this capacitor is sometimes missing or wrong value.
Frequently Asked Questions
Can a bricked Arduino always be recovered by burning a bootloader?
In most cases, yes. As long as the ATmega chip itself is not physically damaged and the ICSP pins are accessible, you can burn a fresh bootloader. The exception is if someone has accidentally set the fuse bits to use JTAGEN (disables ICSP), in which case you need a high-voltage parallel programmer (HVPP) for recovery.
Does burning a bootloader erase my sketch?
Yes. The bootloader burning process erases the entire flash memory of the microcontroller (both the application area and the bootloader section) before writing the new bootloader. Your previous sketch will be lost. After burning, simply re-upload your sketch as normal via USB.
How often does the Arduino bootloader get corrupted?
Rarely under normal use. The most common causes are: power loss during an upload (brief partial write), power supply instability causing a brownout during flash write, accidentally programming the wrong fuse bits, or a failed firmware update. Genuine Arduino boards with quality flash memory rarely suffer spontaneous corruption.
Can I burn a bootloader to an ATmega chip on a breadboard?
Yes! This is a very common technique for making custom Arduino-compatible circuits. Place the ATmega328P on a breadboard with a 16 MHz crystal, two 22pF capacitors, and a 10kΩ pull-up on RESET. Connect ICSP pins to the programmer. After burning Optiboot, the chip can be programmed via a USB-Serial adapter connected to its RX/TX pins.
What’s the difference between “Burn Bootloader” and “Upload Using Programmer”?
“Burn Bootloader” writes the bootloader firmware via ICSP and sets the correct fuse bits. “Upload Using Programmer” skips the bootloader entirely and writes your sketch directly to the chip via ICSP — the sketch occupies the full flash space. Boards uploaded this way cannot receive sketches via USB anymore (unless you burn a bootloader again).
Need a fresh Arduino or a backup board for ISP programming? Shop our complete range of Arduino boards and microcontrollers at Zbotic.in — genuine boards with properly programmed bootloaders, delivered fast across India.
Add comment