Installing Arduino Bootloader on an ATmega32u4
The Atmel ATmega32u4 gained popularity with its use in the Arduino Leonardo, due to the built-in USB support, which made an additional chip unnessary for that purpose. I’ve had a couple of ATmega32u4s in storage for a while, so I decided to try and solder the chip and make an Arduino Leonardo compatible board out of it. Both Adafruit and Sparkfun have ATmega32u4 breakout boards that they sell, and I have used their designs as a reference. Why bother? Because if you are developing an AVR based board with USB, this chip is worth looking at, especially since you can use the existing Leonardo bootloader.
##Soldering
The first step of course, is to solder the darn chip. I used a QFP 44 breadboard adapter, and started by tinning the pads.

Next, I soldered the chip. Diagonal corner pins first, to fix the chip on the board. Used plenty of flux, and a magnifier loupe (getting old!).

After a close inspection, checking for shorts, etc., I assembled the circuit on a breadboard. The schematic can be found here.

For the USB connection, I cut an old USB cable. The color scheme for the wires is shown below. But I (painfully) discovered that D+ and D- are switched some times.

##Bootloader
After setting up the breadboard, I used an ISP programmer (Sparkfun, based on usbtiny) and avrdude to first check the fuses on the chip – to see if the connections are alive, basically:
$ avrdude -c usbtiny -p m32u4 -U lfuse:r:low_fuse_val.hex:h -U hfuse:r:high_fuse_val.hex:h
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9587
avrdude: reading lfuse memory:
Reading | ################################################## | 100% 0.00s
avrdude: writing output file "low_fuse_val.hex"
avrdude: reading hfuse memory:
Reading | ################################################## | 100% 0.00s
avrdude: writing output file "high_fuse_val.hex"
avrdude: safemode: Fuses OK (H:F3, E:99, L:5E)
avrdude done. Thank you.
Next, I got the Sparkfun bootloader and downloaded it to the chip as follows:
$ avrdude -c usbtiny -p m32u4 -U flash:w:Caterina-promicro16.hex
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9587
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: reading input file "Caterina-promicro16.hex"
avrdude: input file Caterina-promicro16.hex auto detected as Intel Hex
avrdude: writing flash (32762 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 32762 bytes of flash written
avrdude: verifying flash memory against Caterina-promicro16.hex:
avrdude: load data flash data from input file Caterina-promicro16.hex:
avrdude: input file Caterina-promicro16.hex auto detected as Intel Hex
avrdude: input file Caterina-promicro16.hex contains 32762 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 32762 bytes of flash verified
avrdude: safemode: Fuses OK (H:F3, E:99, L:5E)
avrdude done. Thank you.
Now, after unhooking the ISP programmer and connecting the USB cable to my computer (running OS X), I got:
# before plugging in USB
$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.MaheshsJawbone-SPPDev
/dev/tty.Bluetooth-Modem
# after plugging in USB
$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.MaheshsJawbone-SPPDev
/dev/tty.Bluetooth-Modem /dev/tty.usbmodem1411
Yay – it’s alive! Now I opened up the Arduino IDE, selected Arduino Leonardo as the board and the above serial port. I put an LED on D2 and wrote a blink sketch which also printed debug statements on Serial. To upload the code to the board, I had to hit upload, and then set RESET of the chip to GND momentarily. And it just worked.
##Acknowledgements
Thanks to Ayush Sagar for pointing out to me that the D+/D- wire colors in USB are unreliable!
##References
- Atmel ATmega32u4 data sheet.
- Adafruit ATmega32u4 breakout board documentation.
- Sparkfun ATmega32u4 breakout board documentation.