First, back up any code and files you have on your CIRCUITPY drive. It will be overwritten by the code you're going to upload to your board. You should not end up losing any files on the QSPI flash, but it's a good idea to back them up anyways.
Download the UF2 for your board to your Desktop.
Find the reset button on your board. It's a small, black button, and on most of the boards, it will be the only button available.
Tap this button twice to enter the bootloader. If it doesn't work on the first try, don't be discouraged. The rhythm of the taps needs to be correct and sometimes it takes a few tries.
Once successful, the RGB LED on the board will flash red and then stay green. A new drive will show up on your computer. The drive will be called
boardname is a reference to your specific board. For example, a Feather will have
FEATHERBOOT and a Trinket will have
TRINKETBOOT etc. Going forward we'll just call the boot drive
The board is now in bootloader mode. Now find the UF2 file you downloaded. Drag that file to the
BOOT drive on your computer.
The lights should flash again,
BOOT will disappear. It should re-enumerate USB and appear as a COM or Serial port on your computer. Make a note of the serial port by checking the Device Manager (windows) or typing
ls /dev/cu* or
/dev/tty* (Mac or Linux) in a terminal.
If you see your board listed in the terminal: Proceed to the Uploading nina-fw with esptool section of this page.
Esptool is an application which can communicate with the ROM bootloader in Espressif chips.
To install esptool, run the following in your terminal:
pip3 install esptool
Click the link below to download the latest nina-fw .bin file. Unzip it and save the .bin file to your desktop.
If you're using macOS or Linux - run the following command, replacing
/dev/ttyACM0 with the serial port of your board and
NINA_W102-1.6.0 with the binary file you're flashing to the ESP32.
esptool.py --port /dev/ttyACM0 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin
If you're using Windows - run the following command, replacing
COM7 with the serial port of your board and
NINA_W102-1.6.0 with the binary file you're flashing to the ESP32
esptool.py --port COM7 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin
The command should detect the ESP32 and will take a minute or two to upload the firmware. The NeoPixel on your board will flicker and flash as the firmware uploads.
If ESPTool doesn't detect the ESP32, make sure you've uploaded the correct .UF2 file to the bootloader.
Once the firmware is fully uploaded, the ESP32 will reset and the NeoPixel will glow blue.
To verify everything is working correctly, we'll load up either an Arduino sketch or CircuitPython code.
If you were previously using your ESP32 with Arduino, you should load up an Arduino sketch to verify everything is working properly and the version of the nina-fw correlates with the version the sketch reads.
Open up File->Examples->WiFiNINA->ScanNetworks and upload the sketch. Then, open the Serial Monitor. You should see the firmware version printed out to the serial monitor.
If you were previously using your ESP32 with CircuitPython, you'll need to first reinstall CircuitPython firmware (UF2) for your board. The QSPI flash should have retained its contents. If you don't see anything on the
CIRCUITPY volume, copy files from the backup you made earlier over to
To verify the new ESP32 WiFi firmware version is correct, follow the Connect to WiFi step in this guide and come back here when you've successfully ran the code. The REPL output should display the firmware version you uploaded.