VPR current draw after shutting down

Hi, I have implemented a soft UART in the VPR FLPR.  I am having trouble power managing it.  I see an unexplained extra 500 uA current draw after I start the CPR until I reset the CPU.

Environment

- Device: nRF54L15
- SDK: nRF Connect SDK v2.9.2 (also checked sdk-nrf v3.2.4 + sdk-zephyr ncs-v3.2.4) (we need ANT support, 2.9.2 is the only SDK that allows this.  ANT for 3.2 is promised "March 2026", of which there are two days remaining.)

Summary

Once the FLPR (VPR) coprocessor on nRF54L15 has been started via nrf_vpr_cpurun_set(vpr, true), the VPR peripheral block draws ~500 µA that cannot be recovered without a full system reset. The 128 MHz PLL is confirmed NOT running (CLOCK.PLL.STAT.STATE = NotRunning). The excess current comes from the VPR peripheral block itself.

Use case

This is a bit-banged UART, because the only available pins were on P2, and were not the dedicated UARTE pins.  I need to power it off when not in use, because "bit banged UART" and "cr2032 powered" are conflicting ideas...

Isolation testing

We systematically isolated the current source:

Configuration Boot current
baseline (no FLPR code at all) 500 µA
VEVIF TX/RX enabled, MBOX enabled, flpr_uart_dev enabled, VPR launcher disabled (FLPR never started) 500 µA
VPR launcher enabled (FLPR starts, enters WFI) 1000 uA
Hardware UARTE instead of FLPR (VPR/VEVIF disabled), same shell lifecycle 500 µA after shell session

Conclusion

The VEVIF/MBOX hardware draws zero extra current. The extra 500 µA appears only after `nrf_vpr_cpurun_set(vpr, true)` has been called.

Register state during excess current

PLL=Off CPURUN=Stop: after NDMRESET
NRF_CLOCK->PLL.STAT: STATE = NotRunning (128 MHz PLL is off)
NRF_VPR130->CPURUN: EN = Stopped (after CPURUN=false + NDMRESET)

What we tried

Approach Result
nrf_vpr_cpurun_set(vpr, false) CPURUN only affects state after reset
CPURUN=Stopped + NDMRESET pulse via DEBUGIF.DMCONTROL CPURUN reads Stopped, PLL reads Off, current unchanged
FLPR sets NRF_VPR_CSR_SLEEP_STATE_SLEEP before WFI Partial: ~650 µA at boot (vs ~1 mA), no effect after active session
FLPR sets NRF_VPR_CSR_SLEEP_STATE_DEEP_SLEEP before WFI No improvement over SLEEP
FLPR sets NRF_VPR_CSR_SLEEP_STATE_HIBERNATE No improvement
nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_PLLSTOP) No improvement (PLL was already off)
Disabling MBOX/VEVIF RX via mbox_set_enabled_dt() No improvement
Not starting VPR at boot, only on demand Boot = 500 µA, but after one start/stop cycle = 1 mA

Questions

1. What mechanism powers down the VPR peripheral block on nRF54L15 after it has been started? Is there a register analogous to `NETWORK.POWER.FORCEOFF` on nRF5340?
2. The PLL is off and CPURUN is Stopped, yet the VPR peripheral draws ~500 µA. What is consuming this power?
3. Is there a way to return the VPR peripheral to its pre-nrf_vpr_cpurun_set(true) state without a full system reset?
4. Are there plans to add PM_DEVICE support to the nordic_vpr_launcher driver?

Notes

- SDK 3.2.4 VPR launcher still has no PM support
- SDK 3.2.4 DT binding made execution-memory optional but doesn't address power-down
- nRF54H20 has LRCCONF per-domain power control; nRF54L15 does not
- nRF54L15 product spec does not document a VPR peripheral power gate

Parents Reply Children
No Data
Related