AVR® Fuses are the locations in non-volatile memory that define the hardware configuration of an AVR device.
Fuses are placed in a select section of memory and consist of a few registers. Each bit of the register represents a different fuse setting. Detailed information on which fuses are available in the different programming modes and their functions can be found in the device datasheet. Instruction clock speed, watchdog timer and debug mode are just a few of the fuse settings available on most devices.
Fuses are changed at programming time with a connected programmer such as the ICE Debugger/Programmer using Atmel Studio 7 IDE. They are latched in place after programming and also at power-up of the device.
Unless careful consideration is made of which Fuse bits are programmed, it is easy for the novice programmer to brick their device (i.e. render the MCU un-programmable/un-debuggable in his/her application circuit).
Brief AVR Fuses Summary
Fuse Programming
The Device Programming window (also known as the programming dialog), gives you the most low-level control over the debugging and programming tools. With it, you can program the device's different memories, fuses and lock bits, erase memories, and write user signatures. It can also adjust some of the starter kit properties such as voltage and clock generators.
The programming dialog is accessible from the Device Programming Icon on the standard toolbar or in the Tools→Device Programming drop-down menu selection.
Device Programming Icon
Menu Selection
The Programming Window will appear with various programming options listed on the left.
Select the Fuses option and the fuses page will appear showing the fuses of the selected device. Fuse settings are presented as check boxes or as drop down lists. The Fuse register settings also appear in the lower pane as hexadecimal values.
Read the Fuses
Press the Read button, in the lower right corner, to read the current value of the fuses. If the Auto read box is checked, the fuse settings will be read from the device each time you enter the fuse page.
Changing the Fuses
From the drop down boxes the fuse settings can be changed. Some selections require a box to be checked or unchecked.
Note - A fuse bit that is selected is set to a "0" in the register.
Program the Fuses
After any changes are made to the settings, press the Program button to write the current fuse setting to the device. If the Verify after programming box is checked, the settings will be verified after a programming operation is completed.
Latching of Fuses
The fuse values are latched when the device enters programming mode and changes of the fuse values will have no effect until the part leaves Programming mode. This does not apply to the EESAVE Fuse which will take effect once it is programmed. The fuses are also latched on Power-Up in Normal mode.
Bricking a Device
The following fuse bytes (and default fuse bit settings) are shown for the ATmega328PB. Key fuse bit settings which could brick the device are highlighted:
FUSE LOW Byte
R/P-0 | R/P-1 | R/P-1 | R/P-0 | R/P-0 | R/P-0 | R/P-1 | R/P-0 |
CKDIV8 | CKOUT | SUT1 | SUT0 | CKSEL3 | CKSEL2 | CKSEL1 | CKSEL0 |
bit 7 | bit 0 |
- CKSELn [n=3:0] – Selects clock source for the system clock
- SUTn [n=1:0] - Selects the delay period from when the External Reset is released (not active anymore) until the Internal Reset is released
- CKOUT – Enables clock output on PB0
- CKDIV8 – Configures the CPU clock to be pre-scaled by 8
- Fuse bit = 1 is un-programmed (inactive/disabled)
- Fuse bit = 0 is programmed (active/enabled)
FUSE HIGH Byte
R/P-1 | R/P-1 | R/P-0 | R/P-1 | R/P-1 | R/P-0 | R/P-0 | R/P-1 |
RSTDISBL | DWEN | SPIEN | WDTON | EESAVE | BOOTSZ1 | BOOTSZ0 | BOOTRST |
bit 7 | bit 0 |
- BOOTRST - If you use a bootloader to flash MCU, this bit must be enabled
- BOOTSZn [n=1:0] - These bits select the bootloader section size
- EESAVE – Exclude the EEPROM during a chip erase procedure
- WDTON – Enable Watchdog Timer by HW
- SPIEN – Enable/Disable In-Circuit Serial Programming (ISP) mode
- DWEN – Enable/Disable DebugWire debug interface
- RSTDISBL – Enable/Disable nRESET pin usage as IO
FUSE EXTENDED Byte
U-1 | U-1 | U-1 | U-1 | U-1 | R/P-1 | R/P-1 | R/P-1 |
- | - | - | - | - | BODLEVEL2 | BODLEVEL1 | BODLEVEL0 |
bit 7 | bit 0 |
- BODLEVELn [n=2:0] - They select the brown-out voltage level when the VDD supply is no longer suitable for operation and the MCU is reset