Modo de bajo consumo STM32f0

Tengo un problema con el modo de bajo consumo en STM32F030F4 (placa de cabecera stm32f030f4p6 ). Cuando trato de ponerlos en modo de parada, todavía consumen alrededor de 5,6 mA , lo cual es demasiado (debería ser alrededor de 500 uA ). Lo puse en modo Stop a través de:

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

No hago ningún RCC en la configuración de GPIO. Además, no tengo ningún dispositivo externo conectado a STM, ninguna resistencia pullup, etc.

Qué estoy haciendo mal ?

Mi código :

    SystemClock_Config();

    GPIO_InitTypeDef GPIO_InitStruct;

      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOF_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();

      /*Configure GPIO pins : PF0 PF1 */
      GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
      GPIO_InitStruct.Mode =  GPIO_MODE_ANALOG;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
             GPIO_InitStruct.Speed =GPIO_SPEED_LOW;
      HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);


      GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
                              |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 
                              |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_13|GPIO_PIN_14;
      GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
         GPIO_InitStruct.Speed =GPIO_SPEED_LOW;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

      GPIO_InitStruct.Pin = GPIO_PIN_1;
      GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed =GPIO_SPEED_LOW;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_RESET); 

         __HAL_RCC_GPIOF_CLK_DISABLE();
      __HAL_RCC_GPIOA_CLK_DISABLE();
      __HAL_RCC_GPIOB_CLK_DISABLE();

while (1)
{

    HAL_Delay(1000);
  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);


}

ingrese la descripción de la imagen aquí

¿Tienes alguna especificación para esto? la hoja de datos muestra 48uA @ 85degC. Si hay pull-ups/pull-downs internos, ¿puede habilitarlos y comprobar...
Es posible que deba deshabilitar cualquier pullups
@ScottSeidman todos los pines ya están configurados 'GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL;'
Las entradas no deben flotar durante la suspensión. Deben ser salidas altas o bajas sin carga O entradas con pullup o pulldown. Una entrada flotante puede causar un drenaje de corriente sustancial y variable.
¿Enlace a la hoja de datos...?

Respuestas (3)

Todos los pines ya están configurados
'GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL;'

Los pines de E/S no deben configurarse como entradas flotantes durante la suspensión.
tienen que ser cualquiera de

  • salidas altas o bajas sin carga o

  • entradas con pullup o pulldown.

Una entrada tirada a cualquiera de los rieles causará un drenaje de corriente mínimo. A veces, uno u otro es más bajo: la hoja de datos debería informarle.

Una entrada flotante puede (y a menudo lo hace) causar un drenaje de corriente sustancial y variable. El par alto/bajo del transistor conectado al pin de entrada puede polarizarse a un estado intermedio para que el flujo de corriente "dispare a través" de Vdd a tierra.


Compruebe todos los periféricos (de nuevo :-)).

Mida los voltajes en TODAS las resistencias restantes.
Todo debe ser ~= 0V en modo STOP.


Hay varias implementaciones y AFAICS no te identifica. El siguiente diagrama de aquí es típico.
Las elipses rojas muestran rutas actuales "solo quizás".

ingrese la descripción de la imagen aquí

Otro - menos opciones desde aquí

En mi experiencia, la estructura STM32 GPIO es sorprendentemente diferente y configurarlos en modo analógico sin resistencias de tracción da como resultado un consumo de corriente más bajo. Esto se refleja en el hecho de que en la nueva serie L4xx de potencia ultrabaja, el modo analógico es la configuración de inicio de los pines.
tanx por respuesta :), verifiqué todos los valores de voltaje de las resistencias (~= cero) en modo de parada

Supongo que está midiendo la corriente de reposo del regulador de voltaje además de la corriente de parada de MCU.

Si este esquema es el correcto, hay un regulador de voltaje LM1117-3.3 a bordo.

La hoja de datos del LM1117 muestra una corriente de reposo típica de 5 mA.

Por lo tanto, tiene 5 mA típicos más 500 µA típicos que dan como resultado 5,5 mA típicos. Bastante cerca de lo que estás midiendo.

Tal vez pueda intentar medir la diferencia entre la corriente activa y la parada y ver si esa diferencia corresponde a la diferencia calculada a partir de los valores en la hoja de datos.

EDITAR1:

También sugeriría actuar SystemClock_Config()al comienzo del programa y no al final del while()ciclo. El contenido de los registros se conserva durante la parada del controlador.

Debo decir que tengo un poco de curiosidad sobre qué se supone que debe hacer un microcontrolador cuando no está conectado a nada.

EDIT2:

Estaba pensando que el depurador/programador podría interferir con su medición, pero si desconecta la línea SWDIO y SWCLK y reinicia el controlador, debería estar bien. El depurador puede habilitar algunos periféricos internos de depuración que podrían consumir corriente adicional. El reinicio o el ciclo de encendido reiniciarán esos periféricos, por lo que estarán inactivos.

En este punto, no sé qué podría causar este sorteo actual. Solo otra idea: verifica que no haya conexiones de soldadura donde no deberían estar. Me las arreglé varias veces para crear un puente de soldadura que era lo suficientemente pequeño para no ser un cortocircuito pero lo suficientemente fuerte como para causar un flujo de corriente significativo.

tanx para la respuesta, uso dos baterías AAA (1.5V cada una) para la placa de suministro de energía y necesito mi MCU en vivo durante dos meses :), no uso usb pwr (5v), si elimino lm1117 en la placa, esto se solucionara el problema ?
@qasem debería ser. Pero comprobaría si mi respuesta es correcta (midiendo la diferencia) antes de eliminarla. No sé cómo programa el chip, así que tal vez necesite conservarlo hasta que haya programado el programa final.
Por favor, dime la solución, terminé el proyecto, solo tengo un problema en el modo de parada :)| consumo de corriente en modo activo = 9 ma | modo de parada = 5,5 ma
@qasem parece un número razonable, así que elimine el LM1117 y vea si ayuda.
ahora elimine lm1117 en el tablero, pero aún tome corriente por encima de 1 ma [valor ahora modo activo 5.5 - modo de parada 3.35]
@qasem He editado mi respuesta según el código adicional que publicaste. Anteriormente medí la corriente del modo de parada del STM32F4xx y fue de alrededor de 10 µA a 110 µA según la configuración, por lo que también debería ser posible empujar el F030 a ese nivel.
probé cualquier muestra y cambié la línea para este método SystemClock_Config , pero no cambié el estado :) tanx por su ayuda
@Arsenal La HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);función llama __WFI()si el segundo parámetro es PWR_STOPENTRY_WFIy llama __SEV();y __WFE();de lo contrario.
@BenceKaulics ah, no entendí bien la documentación, está bien, así que desecha eso. No estoy usando el ST HAL, así que no soy firme en ese sentido.
@BenceKaulics Sí, es correcto llamar al método _wfi en segundo plano;)
@qasem, ¿tiene el depurador/programador conectado mientras mide la corriente?
@Arsenal no, desenchufo el pin [clk, swdio] de la placa, pero uso el pin [3.3 y gnd] del depurador st-link
@qasem, esto realmente se está volviendo extraño. Lo único que me viene a la mente ahora: ¿realiza un ciclo de encendido? (desenchufe el 3.3V y vuelva a enchufarlo)
@Arsenal, vea el tablero de imágenes en cuestión (desde la página superior) Las elipses rojas y negras muestran el pin usado :)
@qasem no son los pines que usa: ¿reinicia el dispositivo después de programarlo, desconectar el cable de alimentación y volver a encenderlo?
@Arsenal, sí, hago clic en el botón de reinicio después de la programación, pero solo uso este pin, ¡por favor, explique más!

Si su tablero tiene algún led que se usa (y la mayoría parece tener, al menos el led para indicar energía), consumirá algo de corriente. Esa puede ser la razón por la que está obteniendo ese nivel de corriente.

tanx por respuesta, ya eliminé todos los led en el tablero