Tengo una placa de circuito con STM32L433 que tiene alrededor de 320uA de consumo de corriente de referencia en el modo STOP 2. Sólo LSE con un cristal de 32kHz está activo.
La placa tiene una alimentación analógica Vdda separada que está deshabilitada para el modo de parada. (atado a tierra). Antes de deshabilitar Vdda, el ADC, DAC y OPAMP se deshabilitan y sus pines se ponen en modo OD bajo.
La configuración se realizó mediante el software STM32CubeMX.
¿Alguna idea de cómo depurar esto? He desconectado y medido casi todos los periféricos externos para ver qué está consumiendo corriente, pero parece que el STM32L433 es el culpable.
Estoy midiendo la corriente con un osciloscopio usando una resistencia de 2ohm en serie con la batería. El LDO podría ser responsable de 20uA de la misma, lo que aún deja 300uA sin contabilizar.
EDITAR:
~ 120uA de ello fue usando el STOP 0 en lugar del STOP 2. Esto fue lo que quedó de alguna experimentación. Ahora estoy en 200uA. También he desconectado los chips BMI160 y DRV2603. Y no son el problema.
EDIT2
He soldado otra placa con sólo un STM32L433 y un LDO LP5907-3.0 y un par de condensadores de desacoplamiento. EL MISMO PROBLEMA.
Este es el código mínimo que he utilizado para configurar los GPIOs
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE()
;
__HAL_RCC_GPIOH_CLK_ENABLE()
;
__HAL_RCC_GPIOA_CLK_ENABLE()
;
__HAL_RCC_GPIOB_CLK_ENABLE()
;
GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_InitStruct.Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_InitStruct.Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOC, GPIO_InitStruct.Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOH, GPIO_InitStruct.Pin, GPIO_PIN_SET);
//BOOT0 PIN
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
EDIT3
El pin USB DM flota cuando el USB está en modo de bajo consumo. Esto causó la corriente vista de 200uA drow. Bajando este pin externamente se eliminan los 200uA. Ahora estoy tratando de encontrar una manera de evitar esto en el firmware.
1 votos
¿Tienes un esquema?
0 votos
¿"Casi" todos los periféricos externos? ¿Por qué no es posible que sea uno de los que no has desconectado? ¿Por qué no usas un amperímetro para medir la corriente consumida?
0 votos
@BenceKaulics lamentablemente no puedo compartirlo
0 votos
@DiBosco los restantes son un acelerómetro BMI160 en modo de suspensión y el driver del motor drv2603 desactivado. Estoy usando un osciloscopio porque el sistema se despierta cada 10ms lo que supone un pico de consumo de corriente, aunque me interesa bajar la línea base en el modo de suspensión
0 votos
@BenceKaulics He actualizado la pregunta con un tablero y código mínimo. ¿Alguna idea ahora?
0 votos
Tal vez podrías configurar esos GPIOs como HighZ antes de dormir (como entradas analógicas) en lugar de salidas push-pull.
0 votos
Lo he intentado. ANALOG o OUTPUT_PP, exactamente lo mismo. ¿Hay algo más que esté activado por defecto y que deba ser desactivado? No hice ninguna inicialización excepto el startup_stm32l433xx.s y el código de mi pregunta.
0 votos
Es el pin USB DM flotando cuando el USB está en baja potencia. He intentado reconfigurar el pin a analógico cuando está en modo de baja potencia, pero no parece que sea posible cuando el USB está configurado.
0 votos
@pkuhar ¿puedes desconfigurar el USB y sólo restaurarlo al detectar el VBus? Dicho esto, este podría ser un momento para ver si puedes contactar con un ingeniero de aplicaciones de ST y obtener su punto de vista sobre cómo se supone que debes hacer esto en el pensamiento de los diseñadores. O si sólo quieres ser crudo, podrías encontrar un valor de resistencia de pulldown lo suficientemente grande como para no ser un problema en la operación, pero lo suficientemente pequeño como para funcionar como un guardián para sesgar fuera de la región de problemas. 100K? 1M?
0 votos
Gracias Criss. Voy con una ruta separada de la detección de VBUS.
1 votos
Buena investigación. Deberías ponerla en una respuesta adecuada en lugar de una edición de la pregunta.
0 votos
Estoy esperando a encontrar la solución definitiva antes de la respuesta. Gracias por las pistas