STM32f0 Modo de bajo consumo

3

Tengo un problema con el modo de bajo consumo en STM32F030F4 (tabla de cabecera stm32f030f4p6 ). Cuando trato de ponerlos en modo de parada, todavía consumen aproximadamente 5.6mA , que es demasiado (debería ser aproximadamente 500uA ). Lo puse en modo Detener a través de:

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

No hago ninguna configuración de RCC en GPIO . Además, no tengo ningún dispositivo externo conectado a STM, ninguna resistencia de extracción, 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);


}

    
pregunta qasem

3 respuestas

1
  

Todo el pin ya está configurado
  '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 desplegable.

Una entrada colocada en 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 indicarle.

Una entrada flotante puede (y con frecuencia lo hace) causar un drenaje de corriente sustancial y variable. El par alto / bajo del transistor conectado al pin de entrada se puede desviar a un estado intermedio, de modo que "dispare" el flujo de corriente desde Vdd a tierra.

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

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

Hay varias implementaciones y usted no identifica su AFAICS. El diagrama a continuación desde aquí es típico.
Las elipses rojas muestran "solo tal vez" las rutas actuales.

Otra y otras opciones desde aquí

    
respondido por el Russell McMahon
4

Supongo que está midiendo la corriente de reposo del regulador de voltaje en la parte superior de la corriente de parada de la MCU.

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

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

Así que tienes un 5mA típico más un 500µA típico que resulta en un típico 5.5mA. Muy cerca de lo que estás midiendo.

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

EDIT1:

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

Debo decir que tengo un poco de curiosidad por lo que 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 restablece el controlador, debería estar bien. El depurador puede habilitar algunos periféricos de depuración internos que pueden consumir corriente adicional. El reinicio o el ciclo de alimentación restablecerán esos periféricos, por lo que estarán inactivos.

En este punto, estoy en una pérdida, lo que podría causar este empate actual. Solo otra idea: verifique que no haya conexiones de soldadura donde no deberían estar. Logré varias veces crear un puente de soldadura que fuera lo suficientemente pequeño como para no ser un cortocircuito, pero lo suficientemente fuerte como para causar un flujo de corriente significativo.

    
respondido por el Arsenal
1

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

    
respondido por el hcabral

Lea otras preguntas en las etiquetas