Using the Flipper Zero as an AVR ISP Programmer: Flashing Arduino Bootloaders and Fuses via GPIO
The Flipper Zero's GPIO header already moonlights as a UART bridge, a logic-level tool, and a general hardware-hacking interface, and it turns out to be a genuinely useful stand-in for a dedicated AVR ISP programmer as well. If you're working with bare ATtiny85 or ATmega328P chips — flashing a fresh Arduino bootloader onto a blank chip, setting fuse bits, or reviving a bricked board whose bootloader got overwritten — the Flipper's GPIO pins can drive the standard 6-pin ISP (In-System Programming) protocol without any extra hardware beyond a handful of jumper wires. This guide covers wiring, the firmware side, and where this approach's limits are compared to a dedicated USBasp or a spare Arduino wired as ISP.
What ISP Programming Actually Does
AVR microcontrollers support a low-level SPI-based programming protocol independent of any bootloader — this is how a completely blank chip gets its first bootloader written, and it's also how fuse bits get set (clock source, brown-out detection threshold, bootloader size) and how flash memory can be read back or erased directly, bypassing whatever firmware is currently running. The protocol uses six signals: MOSI, MISO, SCK, RESET, VCC, and GND. Because it's just SPI plus a reset line, almost anything with four spare GPIO pins that can be driven and read individually can act as an ISP programmer, which is exactly why Arduino boards, Raspberry Pis, and now the Flipper Zero can all fill this role with the right firmware or app running on the host side.
What You'll Need
- A Flipper Zero with its GPIO header exposed (no WiFi Devboard or other add-on needed for basic ISP)
- Six female-to-female or female-to-male jumper wires
- The target AVR chip on a breadboard, or an existing board (bare ATtiny85 in a socket, or an Arduino-compatible board with the AVR accessible)
- A 10µF–100µF capacitor between RESET and GND on the target if you're programming a board with an auto-reset circuit (like a standard Arduino Uno) to prevent the reset line from being pulled by the target's own reset circuitry during programming
- An ISP-capable app on the Flipper — either a community GPIO/ISP app installed from the app catalog, or the Flipper's UART/GPIO bridge mode paired with avrdude running on a connected computer, using the Flipper purely as the SPI-to-USB bridge
Wiring the ISP Header
Standard 6-pin ISP signalFunctionFlipper GPIO pin (typical assignment) MISOMaster In, Slave Out — data from AVR to programmerC1 or another SPI-capable pin per the app's documented mapping VCCTarget power reference (do not power the target from the Flipper unless the app explicitly supports it)3V3 pin, only if target is 3.3V logic SCKSerial clockSPI clock pin per app mapping MOSIMaster Out, Slave In — data from programmer to AVRSPI MOSI pin per app mapping RESETHeld low to enter programming modeAny free GPIO configured as output GNDCommon ground — non-negotiableGND pinExact pin assignments depend on which GPIO/ISP app you're running, since the Flipper's GPIO header pins aren't hardwired to fixed SPI roles the way a dedicated programmer's header is — check the specific app's documentation for its pin map before wiring, and double check with the Flipper Zero's own GPIO pinout reference for pin numbering and voltage tolerance before connecting anything. This site's general guide to the Flipper Zero's GPIO pinout and hardware expansion is the right starting point if you haven't used the header for anything beyond stock accessories yet.
Voltage Compatibility — Read This Before You Wire Anything
The Flipper Zero's GPIO pins run at 3.3V logic and are not 5V tolerant. A huge number of AVR targets in the wild — classic Arduino Uno and Nano boards, most ATmega328P designs — run at 5V. Driving a 5V target's ISP lines directly from the Flipper's 3.3V GPIO will usually still register a valid logic high for the AVR (most AVR inputs accept a 3.3V high as valid at 5V VCC, since the threshold is a fraction of VCC in some cases but commonly closer to a fixed level that 3.3V clears), but this is not a guarantee across every chip and clock speed, and driving 5V signals back into the Flipper's 3.3V-only inputs (MISO from the target) is genuinely risky and can damage the GPIO pin. The safe approach is to only program 3.3V AVR targets directly, or use a bidirectional logic level shifter between the Flipper and a 5V target exactly as described in this site's guide to logic level shifters. Don't skip this step to save five minutes of wiring — GPIO pins are not the cheapest thing to replace on a Flipper.
Programming a Blank ATtiny85 with an Arduino Bootloader
With the target wired and level-shifted if needed, the general workflow mirrors any ISP programming session: put the target chip in a breadboard with a stabilizing capacitor across VCC/GND, connect the six ISP lines, launch the ISP app or bridge mode on the Flipper, and issue the programming command with the correct part number, hex file, and fuse settings for the target. Fuse settings deserve particular care — they set the clock source (internal RC oscillator versus external crystal) and speed, and setting them incorrectly can leave the chip unresponsive to further ISP programming until the fuses are corrected with the right clock configuration, a state commonly called "fuse-bricking." Double-check fuse byte values against a known-good reference for your specific chip and target clock speed before writing them, and never guess.
When to Use This vs a Dedicated Programmer
The Flipper approach is genuinely convenient if you already own one and need to flash an occasional blank AVR without buying a dedicated $10 USBasp — it's a legitimate use of hardware you already have on the bench. But for anyone doing AVR programming regularly, a purpose-built USBasp or an Arduino wired as ISP is faster to set up repeatedly, has 5V-native I/O with no level-shifting concerns, and integrates directly with avrdude and the Arduino IDE without needing a bridge app. Treat the Flipper's ISP capability as a handy occasional tool rather than a full replacement for dedicated programming hardware.
This is a good example of the kind of general-purpose hardware-hacking utility the Flipper's GPIO header was built for — most of what makes it work is standard SPI wiring knowledge that transfers directly to any other microcontroller programming task you'll run into later.
Related Guides
- How to Use the Flipper Zero GPIO for Hardware Hacking: UART, SPI, I2C, and Debugging
- Flipper Zero GPIO: Reading Sensors and Controlling LEDs
- GPIO Basics on Flipper Zero — Wiring and Using Pins
- Flipper Zero GPIO Pinout and Hardware Expansion: UART, I2C, ADC, 1-Wire, and Sensor Wiring
- Getting Started with ESP32: GPIO, WiFi, and Your First Project
- GPIO to External SPI Flash/EEPROM: Read/Write
- Building Your First Custom Flipper Zero App: ufbt Setup, GUI, and GPIO
- Watchdog Timers for Arduino and ESP32: Hardware WDT, Task Watchdogs, and Recovering from Hangs