Forge FC Firmware
All Guides

FC Firmware Flashing Guide

Install ArduPilot, PX4, Betaflight, or iNav on your flight controller. From DFU mode to first arm.

Back to Implementation Guides

Flight Controller
Target Firmware
Your OS
0 Prerequisites
1 Download
2 DFU Mode
3 Flash
4 Configure
5 First Arm
What You Need
Before touching firmware, make sure you have these tools installed on your computer.

STM32CubeProgrammer

ST's official tool for flashing STM32 chips. Works on all OSes. Required for DFU flashing.

Download →

USB Driver (Windows only)

Zadig — replaces the default Windows USB driver so DFU mode works. Not needed on Mac/Linux.

Download Zadig →

Ground Station

Mission Planner (ArduPilot, Windows), QGroundControl (PX4, all OS), Betaflight Configurator, or iNav Configurator.

USB-C Cable

A data-capable USB-C cable. Charge-only cables won't work. If the FC doesn't show up in device manager, try a different cable first.

Important: If your FC currently runs Betaflight and you want ArduPilot (or vice versa), you MUST flash via DFU. You cannot cross-flash via the normal configurator — the bootloaders are different. This guide covers the DFU path.
Windows: After installing STM32CubeProgrammer, you also need Zadig to install the correct USB DFU driver. When the board is in DFU mode, open Zadig, select "STM32 BOOTLOADER" from the dropdown, and click "Replace Driver" (select WinUSB).
macOS: STM32CubeProgrammer works natively. You may also use dfu-util from Homebrew: brew install dfu-util. No driver installation needed.
Linux: Install dfu-util: sudo apt install dfu-util. You may need udev rules for your USB device. STM32CubeProgrammer also works on Linux.
Download Firmware
ArduPilot firmware comes as arducopter_with_bl.hex (includes bootloader — needed for first flash) or .apj (for subsequent updates via Mission Planner).
1
Find your board target on firmware.ardupilot.org
Go to firmware.ardupilot.org → Select vehicle type (Copter, Plane, Rover) → Select your board name.
Orqa boards: If there's no official "OrqaQuadCoreH7" target on firmware.ardupilot.org yet, you need to find the closest compatible hwdef. The Orqa QuadCore H7 uses STM32H743 + twin ICM42688 + DPS310 — this is very similar to MatekH743 or a custom target. Check ArduPilot hwdef directory for an Orqa entry, or ask on the ArduPilot Forum.
2
Download the _with_bl.hex file
This file includes the ArduPilot bootloader + firmware in one. You need this for first-time flashing via DFU. For subsequent updates, Mission Planner can flash .apj files directly.
Point of no return: Flashing the ArduPilot bootloader overwrites the factory bootloader. You will NOT be able to go back to Betaflight/iNav without re-flashing via DFU again. This is normal — it's not bricking, just a different bootloader.
PX4 firmware is flashed via QGroundControl, which downloads it automatically. For DFU, you need the .px4 file from the PX4 firmware server.
1
Open QGroundControl → Vehicle Setup → Firmware
QGC handles download + flash in one step. Plug in your FC and QGC will detect it. Select your board, firmware version, and click Flash. For custom/unsupported boards, use "Advanced" → "Custom firmware file" and point to a local .px4 build.
Betaflight Configurator downloads firmware automatically by board target name.
1
Open Betaflight Configurator → Firmware Flasher
Select your board target (e.g., "ORQA_H743" or the board's BF target name). Choose release version. Click "Load Firmware [Online]." For boards not yet in BF cloud, use "Load Firmware [Local]" with a .hex file.
iNav Configurator works the same as Betaflight — select board target, download, flash.
1
Open iNav Configurator → Firmware Flasher
Select board target. For Orqa boards, the iNav target may already exist since Orqa builds are designed for iNav. Choose version ≥8.0.0 for H7 boards.
Enter DFU Mode
DFU (Device Firmware Update) is a special boot mode built into every STM32 chip. It lets you flash firmware over USB without any existing bootloader. This is the universal "start from scratch" method.
1
Find the BOOT button (or BOOT pads)
Every STM32 FC has a way to enter DFU. Look for: a small button labeled "BOOT" or "DFU" on the board, or two solder pads labeled "BOOT" that you bridge with tweezers.
Orqa QuadCore / WingCore H7: The BOOT button is on the PCB. Hold it down, then plug in USB-C. Release after 1 second. The board is now in DFU mode — no LED pattern, just silence.
Orqa QuadCore H7 — Board Layout
30.5mm × 30.5mm mounting STM32 H743 480MHz M7 ICM42688 ICM42688 orthogonal DPS310 USB-C B BOOT M1 M2 M3 M4 UART GPS Hold this + plug USB = DFU
Orqa APB: The APB has a dedicated flash-mode button (see board layout in user manual, Section 19). Hold it while powering on. The i.MX8M side uses NXP's uuu tool for its own firmware, but the STM32H743 FC side uses standard DFU over the internal USB. You may need to flash the FC via the APB's SoC using the internal UART3 bridge (/dev/ttymxc2) if USB DFU isn't exposed on the APB's external connector.
2
Hold BOOT + plug in USB
Hold the BOOT button (or bridge the pads), then connect the USB cable to your PC. Wait 1 second, then release. The chip is now in DFU mode.
3
Verify DFU mode
Your computer should now see the device.
# Windows: Open Device Manager # Look under "Universal Serial Bus devices" for: STM32 BOOTLOADER # If you see it → DFU mode is working # If you DON'T see it → try a different USB cable (data, not charge-only) # Run Zadig to install WinUSB driver: # 1. Open Zadig # 2. Select "STM32 BOOTLOADER" from dropdown # 3. Select "WinUSB" as the target driver # 4. Click "Replace Driver"Windows
# macOS: Check USB devices system_profiler SPUSBDataType | grep -A 5 "STM32\|DFU" # Or use dfu-util: dfu-util --list # Should show: [0483:df11] STM32 BOOTLOADERmacOS
# Linux: Check USB devices lsusb | grep 0483:df11 # Should show: STMicroelectronics STM Device in DFU Mode # Or use dfu-util: dfu-util --list # Should show: [0483:df11] Internal Flash (0x08000000) # If permission denied: sudo dfu-util --list # Or add udev rule: echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0666"' | sudo tee /etc/udev/rules.d/99-stm32-dfu.rules sudo udevadm control --reload-rulesLinux
Flash Firmware
With the board in DFU mode and firmware downloaded, flash it.
Method A: STM32CubeProgrammer (GUI — recommended for beginners)
1
Open STM32CubeProgrammer
Select "USB" as the connection type (top-right dropdown). Click "Connect." The board's MCU info should appear (STM32H743xx).
2
Open your firmware file
Click "Open file" (second tab on left) and select the arducopter_with_bl.hex file you downloaded. The file contents will appear in the memory view.
3
Click "Download"
This flashes the firmware to the chip. Progress bar will fill. Takes 10-30 seconds. When complete, you'll see "Download complete."
4
Disconnect and power cycle
Click "Disconnect." Unplug USB. Plug back in (without holding BOOT). The FC should now boot ArduPilot — look for a heartbeat LED pattern.
Method B: dfu-util (command line)
# Flash ArduPilot with bootloader via dfu-util dfu-util -a 0 --dfuse-address 0x08000000:leave -D arducopter_with_bl.hex # If using .bin instead of .hex: dfu-util -a 0 -s 0x08000000:leave -D arducopter_with_bl.bin # Verify flash (optional): dfu-util -a 0 -s 0x08000000 -U readback.bin diff -sb arducopter_with_bl.bin readback.bindfu-util
Method C: ArduPilot Web DFU Loader — If you have Chrome, go to firmware.ardupilot.org/Tools/WebTools/DFULoader. It can flash directly from the browser using WebUSB. No software install needed.
1
Betaflight Configurator → Firmware Flasher
With the board in DFU mode, BF Configurator should show "DFU" in the port dropdown (top-right). Select your board target. Click "Load Firmware [Online]" then "Flash Firmware."
1
iNav Configurator → Firmware Flasher
Same as Betaflight — DFU port appears automatically. Select board target, load firmware, flash. For Orqa boards, the iNav target should be available for version ≥8.0.
1
QGroundControl auto-detects
Plug in the FC (in DFU or normal mode). QGC will prompt you to flash firmware. Select PX4 stable, your board, and click OK. For custom boards, check "Advanced" → "Custom firmware file."
Initial Configuration
Firmware is on the board. Now connect your ground station and configure the basics.
1
Connect Mission Planner / QGC
Plug in USB. Select the COM port and baud rate 115200. Click Connect. You should see telemetry data (artificial horizon, etc.).
2
Frame Type
Setup → Frame Type. Select your configuration (Quad X, Hex, Y6, etc.). For Orqa QuadCore → Quad X. For WingCore → select your fixed-wing/VTOL type.
3
Accelerometer Calibration
Setup → Accel Calibration. Follow the prompts to hold the FC level, on each side, nose up, nose down, left, right. This calibrates the ICM42688 IMU.
4
Compass Calibration
If you have an external compass/GPS, calibrate it. If no compass (FPV builds), disable it: COMPASS_ENABLE = 0.
5
Radio Calibration
Setup → Radio Calibration. Bind your RC receiver, then move all sticks to extremes. Click Calibrate. Set up flight modes on a switch (at minimum: STABILIZE + LOITER + RTL).
6
ESC Calibration
Setup → ESC Calibration. Follow the "all-at-once" method: throttle high → power on → beeps → throttle low → beeps → done. For Orqa ESC3030 with DShot, you can skip this (DShot doesn't need calibration).
Motor test: REMOVE PROPS FIRST. Setup → Motor Test. Spin each motor individually and verify: correct order (A→B→C→D), correct direction (ArduPilot motor map), no weird vibrations. If wrong direction, swap any 2 of the 3 motor wires or change direction in BLHeli.
1
Betaflight Configurator → Ports
Enable Serial RX on the UART connected to your receiver. Set protocol (SBUS, CRSF, etc.).
2
Configuration tab
Set mixer (Quad X), receiver protocol, motor protocol (DShot300/600), enable features (GPS, OSD, etc.).
3
Receiver tab
Verify channel mapping. Move sticks — bars should move correctly. Set channel map (AETR1234 for most).
4
Motors tab
PROPS OFF. Test each motor. Verify order and direction match the Betaflight motor diagram. Reverse in BLHeli/BLHeli_32 configurator if needed.
PX4: Use QGroundControl's Vehicle Setup wizard — it walks through Airframe, Sensors, Radio, Flight Modes, and Power in order. iNav: Use the iNav Configurator's Setup tab for similar calibration steps.
First Arm
PROPS OFF for first arm test. Always. No exceptions. An unexpected motor spin at full RPM with props on can cut you or break things instantly.
1
Pre-arm checks
The FC will refuse to arm if something is wrong. Check your ground station for pre-arm failure messages. Common ones: "Compass not calibrated," "RC not calibrated," "Accelerometers inconsistent," "GPS not detected." Fix each one before proceeding.
2
Arm the motors
ArduPilot/PX4: Hold throttle down + yaw right for 2 seconds. Betaflight/iNav: Same, or use a switch (configured in Modes tab). Motors should spin at idle RPM.
3
Verify motor response
Move the sticks gently. All four motors should change speed in response. Tilt the FC by hand — motors should compensate (PID loop is running). If motors respond backwards to tilt, your motor order or direction is wrong.
4
Disarm and install props
Throttle down + yaw left (or disarm switch). Verify motors stop. Now you can install props (CW on CW motors, CCW on CCW) and proceed to your first test flight — ideally in STABILIZE/ACRO mode with a manual safety pilot.
Your FC is flashed, configured, and arming. If you need GPS-denied autonomous flight, head to the LiDAR SLAM Implementation Guide next.