STM32F103 modo de bajo consumo (parada)

Tengo un proyecto en el que estoy tratando de reducir el consumo de energía lo más bajo posible (en un STM32F103RCT6).

Miré el documento de ST sobre cómo reducir el consumo de energía STM32F2 lo más bajo posible e intenté seguir sus recomendaciones:

  • Configuración de todos los pines no utilizados en AIN
  • Apague los ADC
  • apagar USB
  • Usando PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE); para entrar en modo STOP mientras se puede despertar con EXTI

La cuestión es que el consumo de energía sigue siendo de 4,6 mA (frente a 15 en el modo de suspensión _WFI estándar, y alrededor de 30 cuando realmente está haciendo cosas). Las hojas de datos parecen sugerir que el consumo de energía en STOP debe ser inferior a 0,5 mA.

He puesto un osciloscopio en el oscilador externo y de hecho se detiene.

¿Hay algo obvio que me estoy perdiendo? ¿Hay alguna manera de comprobar qué podría estar causando el consumo de energía adicional?

ACTUALIZACIÓN : se me ocurrió un programa de prueba muy simple, derivado del código de ejemplo de ST:

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;


int main(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE, DISABLE);  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  while (1) PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

El consumo de energía con esto sigue siendo de 4,3 mA. También verifiqué el circuito: es REALMENTE básico y medí el voltaje en cada resistencia (y es cero).

¿Algunas ideas? ¡Actualmente estoy pensando que en realidad es el regulador de voltaje LD1117 el que tiene la culpa!

¿Están activos los osciladores internos? ¿Tiene alguna resistencia pullup/pulldown en la placa que tenga un voltaje entre ellos en este modo? ¿Tiene alguna interfaz externa (depurador SWD, serie, USB, etc.) conectada que podría estar extrayendo (o donando) energía a través de las líneas de señal ? Y siempre vale la pena volver a leer los documentos para encontrar algo que podría haberse perdido.
¿Has echado un vistazo a la biblioteca de firmware? Por lo general, hay un ejemplo de modos de bajo consumo en el IIRC. Pruebe también el modo de espera, ya que parece que es el modo de consumo más bajo según el manual de referencia (aunque aún debería ver <1 mA en el modo de parada).
Supongo que esto podría ser un problema de hardware de su circuito alrededor del controlador, y no del controlador en sí. Estaba pensando lo mismo que @ChrisStratton en pullups/downs. Además, ¿dónde y cómo se mide? ¿Qué está conectado a AIN además de los pines no utilizados?
Hola. Gracias por la ayuda, y perdón por la demora en responderte, he estado un poco ocupado. Trataré de investigar esto correctamente. No estoy seguro acerca de los osciladores internos. ¿Cómo lo verificaría? Hay algunos pull-ups/pull-downs: pensé que los había revisado, pero los revisaré de manera más metódica. Había seguido el ejemplo de baja potencia, pero el software del dispositivo es mucho más complejo que eso. Tal vez intente solo con el código de ejemplo y vea si eso logra reducir el consumo de energía.
Acabo de actualizar mi publicación con los hallazgos hasta el momento. Desoldaré el vReg en un momento y probaré sin él.
En caso de que alguien quiera encontrar el documento sobre el consumo de energía STM32F2, se llama AN3430.

Respuestas (1)

Wilhelmsen y Chris tenían razón: era el circuito.

Sin embargo, no fueron resistencias, E/S externas, etc. Fue el regulador de voltaje LD1117 que realmente no había considerado antes.

Resulta que casi todos los reguladores de voltaje LDO de 1A y 3.3v que puedo encontrar tienen una corriente de reposo de 5mA. ¡Acabo de soldar un MIC5205 (que tiene una capacidad nominal de 150 mA) y ahora consume 0,12 mA! \o/