2026-04-10 10:36 AM
Hello,
I am currently developing a project that requires an ultra-low-power BLE-based indoor localization tag. The device should periodically wake up and advertise, remaining in standby mode (targeting approximately 500 nA to 1 µA) for about 90% of the time. I am using NUCLEO-STM32WBA65RI.
For an initial test, I plan to configure the system to stay in standby for around 5 minutes, then wake up and advertise for 30 seconds.
I have already studied the documentation regarding STM32 low-power modes and reviewed examples such as the Heart Rate application, where BLE is used together with low-power modes. However, I still have some doubts.
From my understanding, these examples are designed for continuous radio operation and rely on SRAM1/SRAM2/RADIO retention, which increases power consumption. It also appears that some internal mechanism - possibly the UTIL_TIMER based on RTC or the 2.4 GHz radio timer - is responsible for periodically waking the system to handle BLE activity. Could you clarify which component is actually responsible for these wake-ups?
In the code, the ST sequencer is used, with PreIdle and Idle functions responsible for managing low-power entry.
In the PreIdle function, APP_SYS_BLE_EnterDeepSleep evaluates whether the time until the next radio event (e.g., BLE transmission) is long enough to justify entering a low-power state. In that case, the Link Layer is set into deep sleep (ll_sys_dp_slp_enter).
Then, in the Idle task, UTIL_LPM_Enter is called, which eventually leads to PWR_EnterOffMode. This sets the SLEEPDEEP bit in the SCR register and configures LPMS2 in the PWR_CR1 register.
When the system enters standby, the current consumption is very small until the next radio event, as shown in this image of the current measurement that I have take.
With these examples (bare-metal, without an RTOS), I can measure current consumption in the microamp range, which is acceptable. However, for my application, I would like to further reduce consumption into the nanoamp range.
My idea is to use full Standby mode with no SRAM or radio retention, since the device will sleep most of the time. The system would then use the RTC to wake up periodically, fully reinitialize the BLE stack, and advertise.
My question is: is this approach possible on the STM32WBA series? If so, what would be the correct way to implement it?
In all examples, the main loop runs the ST scheduler, which handles all system tasks. In my case, would it be correct to simply advertise, wait (e.g., HAL_Delay), and then enter Standby mode? Something like:
int main()
{
Init();
Init_BLE();
BLE_Advertise();
HAL_Delay(30000);
Set_RTC_Wake-up();
Enter_StandbyMode();
while(1);
}Please let me know if there is any better approach, or any code snippet in particular that could help to this specific case.
Best regards.