2022-03-25 05:15 PM
Hello,
I'm doing some development work with an STEVAL-IDB011V1 dev board. I'm targeting very low power and so I would like to verify the numbers listed in the datasheet.
In DEEPSTOP mode at room temperature, I am expecting something around1 μA of supply current, per table 24 of the BlueNRG-LP datasheet. However, I'm currently measuring about 5.7 μA at 1.8 V.
I'd like to make sure my methodology in measuring this is correct. My procedure is as follows:
I flash the board with code that runs SystemInit(), configures all GPIOs to have a pulldown resistor and to output low, and then enter DEEPSTOP. I then unplug the board and remove all jumpers (JP1 - JP5). I connect the positive terminal of my 1.8 V power supply to pin 2 of JP1 (named "VBLUE" in the STEVAL-IDB011V1 data brief) and the negative terminal to ground.
I get a somewhat steady 5.7 μA of supply current from my power supply. I also tried connecting VBRD to ground, which changes my supply current to 13.8 μA. I'm not running any timers, so from the datasheet, I'm expecting 0.65 μA.
I'm hoping someone has some advice regarding my methodology or any input as to why my current is as high as it is.
Thanks for the help.
Solved! Go to Solution.
2022-04-28 09:39 AM
I am also using the HAL_PWR_MNGR_Request() function. I ultimately ended up removing all other components from my dev board and using a second dev board to flash it. Now, my supply current is ~100 nA in shutdown mode and ~1.2 µA in deepstop.
Halting the CPU with the power manager or just calling __WFE() draws about 1.3 mA at 1.8 V increasing up to almost 2 mA at 3.3 V, which is still pretty high, but generally my measurement align with the BlueNRG-LP datasheet after removing the extraneous components from the eval board.
I hope this helps.
2022-03-31 08:20 AM
I flash the board with code that runs SystemInit(), configures all GPIOs to have a pulldown resistor and to output low, and then enter DEEPSTOP. I then unplug the board and remove all jumpers (JP1 - JP5). I connect the positive terminal of my 1.8 V power supply to pin 2 of JP1 (named "VBLUE" in the STEVAL-IDB011V1 data brief) and the negative terminal to ground.
_______________
2022-04-28 09:07 AM
I am in a similar situation...
How are you entering DEEPSTOP?
I configure the following:
void main(void)
{
WakeupSourceConfig_TypeDef wakeupIO;
PowerSaveLevels stopLevel;
int err;
/* System initialization function */
if (SystemInit(SYSCLK_64M, BLE_SYSCLK_32M) != SUCCESS)
{
/* Error during system clock configuration take appropriate action */
while (1)
;
}
HAL_Init();
HAL_VTIMER_InitType VTIMER_InitStruct = {HS_STARTUP_TIME, INITIAL_CALIBRATION, CALIBRATION_INTERVAL};
HAL_VTIMER_Init(&VTIMER_InitStruct);
wakeupIO.IO_Mask_High_polarity = 0;
wakeupIO.IO_Mask_Low_polarity = 0;
wakeupIO.RTC_enable = 0;
timeoutHandle.callback = timerCallback;
while (true)
{
HAL_VTIMER_Tick();
if (state)
{
HAL_Delay(TIMEOUT_MSEC);
state = 0u;
}
else
{
if (timerExpired)
{
// Start measurement timer.
timerExpired = false;
err = HAL_VTIMER_StartTimerMs(&timeoutHandle, TIMEOUT_MSEC);
assert(err == HAL_OK);
}
// interrupts wakeup
//HAL_PWR_MNGR_Request(POWER_SAVE_LEVEL_STOP_WITH_TIMER, wakeupIO, &stopLevel);
HAL_SuspendTick();
HAL_PWR_MNGR_Request(POWER_SAVE_LEVEL_CPU_HALT, wakeupIO, &stopLevel);
HAL_ResumeTick();
state = 1u;
}
}
}
When using CPU_HALT, I see 4.0mA of current draw when active and 2.9mA of current draw when asleep. Alternatively, when using STOP_WITH_TIMER, I see 4.0mA of current draw when active and 0.3mA when asleep.
These values seem very high.
2022-04-28 09:39 AM
I am also using the HAL_PWR_MNGR_Request() function. I ultimately ended up removing all other components from my dev board and using a second dev board to flash it. Now, my supply current is ~100 nA in shutdown mode and ~1.2 µA in deepstop.
Halting the CPU with the power manager or just calling __WFE() draws about 1.3 mA at 1.8 V increasing up to almost 2 mA at 3.3 V, which is still pretty high, but generally my measurement align with the BlueNRG-LP datasheet after removing the extraneous components from the eval board.
I hope this helps.
2022-04-28 12:00 PM
Could you share your testing code? Specifically, if I do SystemInit without BLE_SYS_CLK, I get lower values, but it seems I can no longer use VTIMERS?
2022-04-28 02:06 PM
Not sure I can help you there, I haven't used VTIMERS. The RTC works for my needs.
I don't have my exact test code, but it looks something like this:
int main(void)
{
/* System initialization function */
if (SystemInit(SYSCLK_DIRECT_HSE, RADIO_SYSCLK_NONE) != SUCCESS)
{
while (1)
; // Error during system clock configuration
}
/* set all GPIO to low */
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = LL_GPIO_PIN_ALL;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
LL_GPIO_WriteOutputPort(GPIOA, 0x0000);
LL_GPIO_WriteOutputPort(GPIOB, 0x0000);
/* system config */
CLEAR_BIT(RCC->CR, RCC_CR_HSEPLLBUFON); // turn off HSEPLLBUF
MODIFY_REG_FIELD(RCC->CFGR, RCC_CFGR_CLKSYSDIV, 0x1); // set system clock to 32 MHz
/* HAL power manager */
uint8_t ret_val;
WakeupSourceConfig_TypeDef wakeupIO;
PowerSaveLevels stopLevel;
wakeupIO.RTC_enable = 1;
/* disable AHB and APB clocks */
LL_AHB_DisableClock(LL_AHB_PERIPH_ALL);
LL_APB0_DisableClock(LL_APB0_PERIPH_ALL);
LL_APB1_DisableClock(LL_APB1_PERIPH_ALL);
LL_APB2_DisableClock(LL_APB2_PERIPH_ALL);
/* enter deepstop */
RTC_WakeupInit();
SetRTC_WakeupTimeout(4096);
ret_val = HAL_PWR_MNGR_Request(POWER_SAVE_LEVEL_STOP_WITH_TIMER, wakeupIO, &stopLevel);
if (ret_val != SUCCESS)
while (1)
;
DisableRTC_WakeupTimeout();
RTC_WU_Complete = 0;
}
2022-04-29 12:01 AM
HI @IJenk.1 ,
In case you don't have it, let me share with you documenation regarding power save mode :
Hope it helps.
Regards,
Sebastien.
2022-04-29 01:47 PM
@Sebastien DENOUAL I tagged you in another post. I will stop hogging the OP's thread.Thanks for the reference. I was aware of it.