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);
}
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".
Otro - menos opciones desde aquí
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.
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
función llama __WFI()
si el segundo parámetro es PWR_STOPENTRY_WFI
y llama __SEV();
y __WFE();
de lo contrario.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.
usuario19579
scott seidman
Qasem
Russel McMahon
Russel McMahon
Qasem