Files
Andrew Yong 3c04a79031 fix(stm32wl): improve reboot-to-DFU reliability (#11698)
- In enter_dfu, arm enterDfuAtMsec = millis() + 5s and return instead of
  resetting inline; the want_response ACK then goes out the normal path
  and Power::powerCommandsCheck() calls enterDfuMode() at the deadline.
  Nudge the deadline off 0 in the rare case the addition wraps to it,
  since powerCommandsCheck() reads 0 as unarmed. The delay is the
  client's detach window - and the margin a WebSerial web flasher needs
  (meshtastic/web-flasher#426).
- In enterDfuMode(), stop the GPS and drain/end every configured UART
  before the reset. The ROM bootloader autobauds off the first byte on
  USART1 (PB6/PB7) or USART2 (PA2/PA3), and on every WL variant a
  console UART or the GPS stream sits on those pins. Factor the drain
  into quiesceSerial() and reuse it in cpuDeepSleep().
- Move earlyBootCheck from constructor(101) to .preinit_array, ahead of
  the core's premain()/SystemClock_Config() whatever the link order, and
  reset RCC before jumping to system memory.

The handler used to reset the MCU inline, before the ACK was sent and
while the client still held the console UART. The STM32WL ROM bootloader
autobauds off the first byte received; a stray byte during the handoff
(a trailing protobuf frame, a port-close DTR/RTS glitch) desynced it and
left the device unreachable at any baud until a hard reset.

STM32WL only: every hunk is behind #if defined(ARCH_STM32) or lives in
main-stm32wl.cpp. nrf52, rp2040 and the rest are unchanged.

Known limitation: gps->disable() only issues a UBX sleep command, so a
non-u-blox or otherwise free-running GPS with no hardware enable/standby
pin keeps transmitting on its UART past this point. If that UART is
USART1 (PB6/PB7) or USART2 (PA2/PA3), the ROM bootloader can still
autobaud onto the GPS stream instead of the host. New STM32WL hardware
designs should keep GPS UARTs off those two bootloader-autobaud pins, or
provide a way to power down or hold the GPS in reset before DFU.

Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>

Signed-off-by: Andrew Yong <me@ndoo.sg>
2026-09-02 10:47:23 +00:00
..
2026-08-20 12:28:57 +00:00
2026-08-20 12:28:57 +00:00
2026-07-01 19:01:27 -05:00
2026-07-16 18:57:50 -05:00