Release Notes
Betaflight 2025.6.0-rc1 brings a massive range of new features, improvements, fixes, and new hardware support. For comprehensive release nots please see: https://betaflight.com/docs/wiki/release/Betaflight-2026-6-Release-Notes
Please use the online pre-release version of the Betaflight App for configuring this release. It can be found here: https://master.app.betaflight.com
What's Changed
Features
- OSD: Custom text received from serial to be displayed by @blckmn in #14895
- Add switchable battery profiles by @jury89 in #14965
- Include AssistNow Autonomous into GPS features by @stsypanov in #14987
- Add individual servo channel forwarding support and run servo mixer for default frame types by @blckmn in #15013
- Upixel UP-T1-001-Plus support and optical flow position hold by @SteveCEvans in #14922
- Add flight plan PG configuration, CLI waypoint commands, and AUTOPILOT mode by @blckmn in #15030
- feat: add CAN peripheral support for STM32G4, STM32H7 and STM32C593 (ENABLE_CAN) by @blckmn in #15115
- Nav autopilot by @SteveCEvans in #15026
- feat: DroneCAN protocol stack (NodeStatus + GetNodeInfo) by @blckmn in #15137
- SITL: gate bridge-specific transforms on SITL_BRIDGE_GAZEBO by @blckmn in #15158
- feat: DroneCAN GNSS Fix2 provider (drives gpsSol) by @blckmn in #15143
- feat: STM32N6570-DK bring-up — LTDC backend, SSD1306 backend, dump cmd by @blckmn in #15153
- AUTOPILOT: Step one, Flight plan guidance implementation by @blckmn in #14923
- telemetry/mavlink: add HOME_POSITION/SYSTEM_TIME/STATUSTEXT TX by @blckmn in #15213
- STM32N6 platform support by @blckmn in #15214
- telemetry/mavlink: vehicle-setup unlock + custom_mode discovery by @blckmn in #15220
- Add ap_stop_threshold setting and improve braking performance by @SteveCEvans in #15150
- telemetry/mavlink: MISSION protocol upload/download by @blckmn in #15224
- The MAVLink packets rates change by using Ground Control Station by @demvlad in #15291
Improvements
- PICO use timeUs_t return types for time functions. by @mjs1441 in #14817
- Quick fix for issuix for issue 14819 by @PD45-46 in #14843
- Change displayed precision of max current of the post-flight statistics to float by @qubicllj in #14853
- delete file PICO/dshot.pio.programs by @qqqlab in #14863
- CLEANUP: make clean CONFIG=X by @blckmn in #14830
- REFACTOR: Camera Control in preparation for RP2350 implementation by @blckmn in #14856
- PICO: Use memfunctions.S from rp2040 bootrom source for memset, memcpy. by @mjs1441 in #14876
- PICO: Remove startup .S file (not in use). by @mjs1441 in #14886
- Report sensor hardware names per sensor type by @haslinghuis in #14892
- Add ACCGYRO_LSM6DSK320X by @haslinghuis in #14891
- Add MSP support for Attitude quaternions by @Robolightning in #14761
- Refactor release workflow to streamline artifact handling by @blckmn in #14910
- PICO: bidirectional DShot telemetry with edge detection by @andyp1per in #14887
- Add Nooploop TOFSense rangefinder family support by @ArturPelicho in #14896
- Add support for ICM42622P by @haslinghuis in #14918
- Add DEFAULT_BEEPER_OFF_FLAGS for reset of beeper_off_flags. by @mjs1441 in #14809
- Strengthen MSP/CRSF Packet Validation by @VoodooChild99 in #14842
- CRSF AHRS Support by @andyp1per in #14870
- Adding Simplifed Master Slider to Adjustments by @spatzengr in #14371
- MSP-adjCenter_adjScale by @spatzengr in #14920
- feat(driver): add MMC5603 magnetometer driver by @gintaris in #14924
- SITL: add -z,noexecstack linker flag to suppress RWX segment warning by @blckmn in #14938
- Feature/bmp580 barometer by @gintaris in #14925
- Flash/MT29F - First cut of support for the MT29F1G01ABAFDWB-IT:F flash chips (1Gb NAND) by @hydra in #14828
- SPI ExpressLRS 4.0 support by @CapnBry in #14932
- Move SCHEDULER_RELAX_RX/OSD STM32F411xE override from src/main to src/platform with fallback defaults by @blckmn in #14958
- Move GPIO_TypeDef and IO_GPIO out of common drivers into platform-specific headers to decouple IO implementation from hardware details by @blckmn in #14962
- CLI: Adding "options" for outputting the msp_build_info equivalent in the CLI by @blckmn in #14951
- Remove unused EXTITrigger_TypeDef mock definitions from SITL target and unit test platform headers by @blckmn in #14963
- faster cos and sin method by @Quick-Flash in #14790
- Move SmartAudio UART bidir push-pull prepend logic from MCU ifdef to UART_TRAIT_BIDIR_PP_PREPEND platform trait by @blckmn in #14956
- MSP: validate servo mixer targetChannel and inputSource bounds in MSP_SET_SERVO_MIX_RULE by @blckmn in #14952
- Add support for GigaDevice GD25Q16E and Zetta ZD25WQ32CE flash memories by @jwoloch in #14970
- BLACKBOX: log GPS epoch timestamp in H-frame and msToW in G-frame by @blckmn in #14950
- Sensors: Add initial support for ICM42686P by @haslinghuis in #14941
- SITL: Add ability to specify a command line argument and load a text file for writing config. by @blckmn in #14935
- Move timer functions to accept timerHardware_t*, rename platform-specific abbreviations, and relocate platform-only declarations to platform/timer.h by @blckmn in #14967
- flash_m25p16: Add support for GD25Q128 flash chip by @HGLRC-T in #14983
- Refactor DMA driver to abstract platform-specific types and functions behind a hardware-agnostic API by @blckmn in #14990
- Consolidate ENABLE_SDIO_INIT definitions in platform.h with explicit per-MCU family settings by @blckmn in #14991
- Move NVIC priority utility macros from nvic.h to per-platform platform.h headers by @blckmn in #14996
- Move platform-specific Bit_RESET definition from serial_4way to platform headers as GPIO_PIN_RESET by @blckmn in #14997
- Move expressLrsTimerEnableIRQs to platform common to remove USE_HAL_DRIVER from src/main by @blckmn in #14998
- Replace F7 platform guard for SERIAL_CHECK_TX with ENABLE_SERIAL_SKIP_CHECK_TX macro by @blckmn in #15001
- Refactor transponder IR DMA buffer type to uint32_t to remove platform dependency by @blckmn in #14995
- Replace STM32H7 preprocessor checks in asyncfatfs with ENABLE_AFATFS_DMA_CACHE feature flag by @blckmn in #14994
- Move platform-specific MSC/SDIO type abstractions and DMA init from src/main/msc to src/platform headers and common source by @blckmn in #14993
- Move overclock frequency options from chip-specific ifdefs in settings.c to ENABLE_OVERCLOCK_XXX_MHZ defines in platform headers by @blckmn in #14999
- Move hardware-specific OctoSPI/QuadSPI definitions and GPIO config from src/main headers to platform files by @blckmn in #14992
- Deprecate gyro_hardware and introduce cli sensor_hardware command by @haslinghuis in #15009
- Replace recursive submodule checkout with on-demand SDK hydration and selective per-platform caching in CI by @blckmn in #15021
- Improve handling of GPS messages by @stsypanov in #15020
- Replace SIMULATOR_BUILD with ENABLE_SIMULATOR flags in src/main and add platform stubs to eliminate simulator ifdefs from init.c by @blckmn in #15017
- Replace void* and MCU-specific TypeDef pointers with opaque resource types in driver interfaces by @blckmn in #15033
- Remove airmode lpf by @Quick-Flash in #15029
- Migrate UART from HAL to LL, eliminating HAL handle dependencies by @blckmn in #15035
- Migrate STM32 I2C from HAL to LL with register-level state machine by @blckmn in #15037
- STM32H5: convert lib/main/STM32H5 to STM32CubeH5 submodule (v1.6.0) by @blckmn in #15054
- GPS: reorder UBLOX procession to have NAV_PVT and NAV_SAT messages first by @stsypanov in #15044
- Add MSP2_CLI_SETTING (0x300E) command for getting and setting CLI settings over MSP by @blckmn in #14972
- Guard escSensorPassthrough with USE_PWM_OUTPUT in CLI serialpassthrough by @blckmn in #15067
- Fix SDK hydration race condition in parallel builds by @blckmn in #15083
- feat: add support for Macronix MX25L12845G flash by @oskarsselis in #15065
- Expand chirp debug channels for offline system identification by @blckmn in #15113
- Remove STM32 MCU-family ifdefs from src/main by @blckmn in #15122
- Update mt29f flash support by @hydra in #15134
- Add by25 q128 es memory ic support by @MatviiG in #15042
- Expose transponder provider and data via CLI by @blckmn in #15126
- SITL: Gazebo Harmonic model fixes and UDP RX path by @blckmn in #15140
- Add CLI 'env' command; drop compiled-in MCU type ID by @blckmn in #15139
- feat: LCD console subsystem for runtime debug output by @blckmn in #15148
- PICO: gyro_clkin platform abstraction so RP2350 can use USE_GYRO_CLKIN by @blckmn in #15162
- Add support for the BOYAMICRO BY25Q64 flash. by @LYNHQQ in #15025
- Speed up serial GPS message decoding by @stsypanov in #15129
- MSP: Expose additional rpm fields by @haslinghuis in #15144
- usb: derive product name from BOARD_NAME when a config is built by @blckmn in #15182
- GPS: replace full a calendar to epoch round trip with a direct field copy by @stsypanov in #15184
- drivers/flash: OctoSPI multichip support + MX66UW1G45G driver by @blckmn in #15199
- telemetry/mavlink: add RX dispatch and handshake responders by @blckmn in #15211
- GPS: add fast-path for UBX_PARSE_PAYLOAD_CONTENT state by @stsypanov in #15183
- test: compute CRSF CRC at runtime in ELRS MSP version test by @ChrisRosser in #15204
- feat(flash): add support for XTX XT25F128F by @gaoyu2144287 in #15219
- ComputeLedStripColorByVtxFreq by @ctzsnooze in #15135
- refactor: make ELRS V3 default, require USE_ELRSV4 for V4 by @haslinghuis in #15232
- Move submodules from lib/main to lib/modules by @blckmn in #15241
- chore: remove dead code in #if 0 blocks by @haslinghuis in #15237
- Improve the speed of scaleRangef by @Quick-Flash in #15048
- AT32: add gyro_clkin platform implementation by @blckmn in #15251
- PICO: Simplify pico_trace by @mjs1441 in #15263
- Replace Biquad with SVF by @Quick-Flash in #15056
- Task stats improvements for state-based tasks by @mjs1441 in #15276
- Share common/stm32 source list across STM32-style families by @blckmn in #15307
- Apply serialRxBytesWaiting-related optimization to /src/main/telemetry by @stsypanov in #15305
- refactor(axis): sign-bearing earth-frame axis enums (ENU/NWU/EF) across IMU & navigation by @haslinghuis in #15346
Fixes
- Fix custom mag_align_yaw by @haslinghuis in #14849
- Fix ICM-40609D accelerometer reading 0.5g instead of 1.0g by @nerdCopter in #14834
- PICO dshot timing update - fix erratic motor movement when disarmed by @qqqlab in #14864
- Scheduler - upgrade taskCount and lateTaskCount to uint32_t. by @mjs1441 in #14889
- CRSF: fix race condition in subset frame handling by @andyp1per in #14893
- [RX] Fix RX_MSP: missing CLI feature name and RX rate always 0 by @Remenby31 in #14861
- Fix error in blackbox.c when building without LTO by @mjs1441 in #14816
- Fix battery percentage calculation with battery capacity set to 0 by @michaeldebacker in #14899
- Define USE_LED_STRIP if USE_LED_STRIP_64 is defined by @osirisinferi in #14916
- fix: remove beacon timestamp update when blocked by @nerdCopter in #14904
- Fix motor output not restored after ESC passthrough exit by @kedeng in #14917
- PICO DShot bidir - clarify code to prevent build error with DEBUG=GDB by @mjs1441 in #14926
- Fix use of uninitialised variables in acceleration.c, gyro.c by @mjs1441 in #14928
- Remove linker script for SITL target on MacOS x86-64 by @tstibor in #14934
- FIX: Virtual GPS provider does not need a serial port by @blckmn in #14936
- Update camera control condition in common_post.h by @haslinghuis in #14948
- CLI: fix NULL pointer dereference in help search by @jury89 in #14947
- FIX: dshot beacon by @haslinghuis in #14869
- PICO DSHOT (bidir) - fix for telemetry sampling. by @mjs1441 in #14968
- Constrain GYRO_CLKIN to supported IMU sensors by @haslinghuis in #14971
- fix: initialize vtxtable powerlabels buffer to prevent strncpy stack corruption (#14835) by @nerdCopter in #14979
- Drivers: correct LSM6DSV16X FS_G_4000DPS encoding by @zebulon-86 in #15043
- Fix calib arm disable flag for SITL by @haslinghuis in #15073
- SITL: move .pg_registry out of the executable segment by @blckmn in #15116
- Pico Fix UART issues and implement SERIAL_CHECK_TX option by @mjs1441 in #15117
- Display altitude in sensors tab even if not armed by @SteveCEvans in #15119
- fix: escprog ki 255 (KISSALL) broken on DShot builds (fixes #15114) by @nerdCopter in #15132
- Resolved wrong string buffers size issue by @demvlad in #15141
- Send 0x03 gps time CRSF message by @ot0tot in #15167
- drivers/bus: NULL-check dev->bus in busBusy() by @blckmn in #15188
- Fix QMC5883P by @haslinghuis in #15174
- Fix CLI entry race condition in MSP serial processing (fixes #14169, #15071) by @nerdCopter in #15193
- fix(config): unconditionally clamp failsafe_procedure to valid range by @nerdCopter in #15192
- telemetry/mavlink: send GLOBAL_POSITION_INT.hdg in centidegrees by @blckmn in #15205
- Improve OSD VTX information in non factory band by @chibaron in #15175
- fix(uart): guard half-duplex pinless UART modes by @kedeng in #15218
- CRSF: bound subset RC channel unpacking by @Symmetricity in #15249
- cli: NULL-safe nextArg, fix CLI null-deref crashes in aux/color/led by @blckmn in #15253
- fix(common): guard atoi() with PLATFORM_NO_LIBC by @katzfey in #15260
- fix: IST8310 magnetometer check DRDY before reading data by @haslinghuis in #15243
- Fix duplicate PG ID by @haslinghuis in #15225
- PICO: Fix unsafe use of naive MAX, MIN macros by @mjs1441 in #15269
- STM32H5: fix SPEEDYBEEH5 bring-up (clock tree, SPI kernel clock, ADC null-deref) by @haslinghuis in #15293
- Althold fixes by @ctzsnooze in #15299
- allow for POS_HOLD in SITL by @ehenry344 in #15280
- Ensure heading is known before enabling GPS based position hold by @SteveCEvans in #15240
- STM32C5: C562 platform bring-up (I3C-as-I2C, SPA06 baro, ADC mux, baro pacing) by @blckmn in #15302
- Adjust PIDs and fix FF scaling in Altitude Hold by @ctzsnooze in #15303
- STM32C5: fix I3C legacy-I2C register reads for the SPA06 baro by @blckmn in #15328
- STM32C5: bound ADC internal-sensor waits so a stalled ADC can't hang the scheduler by @blckmn in #15329
- Fix GPS distance calculation and sign of accelEast by @SteveCEvans in #15321
- fix(accgyro): IIM-42652 FSR/AAF + restore IIM-42653 AAF placement by @haslinghuis in #15261
- fix(baro): close negation around all default-baro defines by @katzfey in #15259
- fix(msp): cancel pendingRequest on '$' only, restoring per-byte lastActivityMs by @nerdCopter in #15323
- fix(dshot): remove stale requestTelemetry bridge in AT32/APM32 bitbang bbWriteInt by @tracycam in #15326
- dshot_bitbang: replace telemetry busy-wait with non-blocking DMA abort by @ChrisRosser in #15332
- Fix OSD RTC short timezone offset by @anoshyn in #15312
- fix(position): correct East-West inversion in getLinearAccelENU by @haslinghuis in #15342
- fix(sitl): restore Gazebo gyro Z sign lost in #15280 by @nerdCopter in #15354
- RX MSP Override: require fresh MSP RC data before substituting channels by @EdikSimonian in #15217
- Position hold =Update 2026-6 by @ctzsnooze in #15361
Targets
- Enable important features for RP2350B by @andyp1per in #14875
- Update mk/config.mk to allow include of board-specific config.mk by @mjs1441 in #14810
- Add STM32N6 HAL/LL drivers and USB device library by @blckmn in #15000
- STM32N6: move vendor HAL to STM32CubeN6 submodule (v1.3.0) by @blckmn in #15011
- Add ESP32-S3 platform scaffold with stub drivers, build system integration, and split platform-specific tools into platform mk directories by @blckmn in #15016
- STM32H5: add SPI bus support with GPDMA infrastructure by @blckmn in #15063
- Add ESP32 interrupt infrastructure, harden UART driver, and fix opaque resource types by @blckmn in #15064
- STM32H5: add UART driver support with CLI enabled by @blckmn in #15068
- Add GDMA-backed SPI DMA transfers for ESP32-S3 by @blckmn in #15069
- Update APM32F4 and USB libraries by @LuckkMaker in #15098
- PICO: Initial commit for framebuffer OSD displayport device (FB_OSD) with RP2350 implementation. by @mjs1441 in #14882
- Add apm32f425/427 support by @LuckkMaker in #15138
- add gd32h7xx firmware library support by @jianpingwu1 in #14985
- STM32C5: add STM32C562 platform support (NUCLEO-C562RE bring-up) by @blckmn in #15172
- STM32C5: source SYSCLK from HSE via PSI (with HSI fallback) by @blckmn in #15177
- Add STM32H757 dual-core MCU support by @andyp1per in #15234
- STM32N6: working CONFIG_IN_MEMORY_MAPPED_FLASH on OPENN657V1 by @blckmn in #15246
- Add xcore32m7 platform support by @LYNHQQ in #15169
- STM32N6 OBL + BF NS bring-up: USB VCP enumerates, CLI responsive by @blckmn in #15257
- STM32C5: enable SPI DMA on the STM32C562 target by @blckmn in #15322
- STM32C5: config partition at end of flash; C591 UART pins by @blckmn in #15335
New Contributors
- @PD45-46 made their first contribution in #14843
- @qqqlab made their first contribution in #14863
- @andyp1per made their first contribution in #14875
- @Remenby31 made their first contribution in #14861
- @b-r-y made their first contribution in #14829
- @michaeldebacker made their first contribution in #14899
- @Robolightning made their first contribution in #14761
- @ArturPelicho made their first contribution in #14896
- @VoodooChild99 made their first contribution in #14842
- @spatzengr made their first contribution in #14371
- @gintaris made their first contribution in #14924
- @jury89 made their first contribution in #14946
- @jwoloch made their first contribution in #14970
- @remete618 made their first contribution in #14982
- @HGLRC-T made their first contribution in #14983
- @Manwe-777 made their first contribution in #14945
- @stsypanov made their first contribution in #14987
- @hanneskaeufler made their first contribution in #15045
- @zebulon-86 made their first contribution in #15043
- @oskarsselis made their first contribution in #15065
- @MatviiG made their first contribution in #15042
- @gaoyu2144287 made their first contribution in #15219
- @Romin0615 made their first contribution in #15242
- @Symmetricity made their first contribution in #15249
- @ehenry344 made their first contribution in #15280
- @anoshyn made their first contribution in #15312
- @EdikSimonian made their first contribution in #15217
Full Changelog: 2025.12.4...2026.6.0-rc1