Hi there,
and Welcome here…
So You’re seeing a classic “back-powering the UART bridge” problem. With CONFIG_SERIAL/CONFIG_UART_CONSOLE on, the MCU brings up UARTE and actively drives TX at boot. If the USB-UART chip (on the XIAO that’s the on-board debug/bridge) is unpowered on battery, your TX line back-feeds it through ESD diodes. Result: brownout-ish behavior or no boot until you plug in USB-C.
Make RTT your default console everywhere (works on battery, no external power needed), and keep a second profile that enables UART for bench time.
Use this prj.conf (battery-safe, Default)
# Console/logging over RTT (safe on battery)
CONFIG_SERIAL=n
CONFIG_UART_CONSOLE=n
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_LOG=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_DEFAULT_LEVEL=3
Build (default) :
west build -p always -d build_batt ^
-b xiao_nrf54l15/nrf54l15/cpuapp . ^
-DBOARD_ROOT="C:/ncs/Seeed/platform-seeedboards/zephyr"
prj_uart.conf (bench profile with USB plugged in)
# Include the battery-safe base first if you like layering; or copy prj.conf and flip these:
CONFIG_SERIAL=y
CONFIG_UART_CONSOLE=y
# Optional: leave RTT on too (can be handy)
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_UART=y
Build with uart profile:
west build -p always -d build_uart ^
-b xiao_nrf54l15/nrf54l15/cpuapp . ^
-DBOARD_ROOT="C:/ncs/Seeed/platform-seeedboards/zephyr" ^
-DOVERLAY_CONFIG="prj_uart.conf"
This gives you one image that always boots on battery (RTT), and another that speaks UART when USB is present. Same source, just flip the config.
HTH
GL
PJ ![]()
for you right now
- Switch your default to RTT (
CONFIG_SERIAL=n,CONFIG_RTT_CONSOLE=y). That will boot on battery every time. - Keep a second config (
prj_uart.conf) that turns UART console back on for bench work when USB-C is plugged.
This keeps behavior identical across all projects and avoids chasing per-board quirks.