Tengo una placa de circuito con STM32L433 que tiene alrededor de 320 uA de consumo de corriente de referencia en el modo STOP 2. Solo LSE con un cristal de 32kHz está activo.
La placa tiene alimentación Vdda analógica separada que está deshabilitada para el modo de parada. (atado a tierra). Antes de deshabilitar Vdda, ADC, DAC y OPAMP se deshabilitan y sus pines se colocan en modo OD bajo.
La configuración se realizó mediante el software STM32CubeMX.
¿Alguna idea de cómo depurar esto? Desconecté y medí casi todos los periféricos externos para ver qué consume corriente, pero parece que el STM32L433 es el culpable.
Estoy midiendo la corriente con un osciloscopio usando una resistencia de 2 ohmios en serie con la batería. El LDO podría ser responsable de 20 uA, lo que aún deja 300 uA sin contabilizar.
EDITAR:
~ 120uA de él estaba usando STOP 0 en lugar de STOP 2. Esto fue un remanente de algunos experimentos. Ahora estoy en 200uA. También desconecté los chips BMI160 y DRV2603. Y ellos no son el problema.
EDIT2
He soldado otra placa con solo 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 usé para configurar los GPIO
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 la entrada USB está en modo de bajo consumo. Esto causó el drow actual de 200uA visto. Al tirar de este pin hacia abajo, se eliminan los 200 uA. Ahora estoy tratando de encontrar una forma de evitar esto en el firmware.
Después de pasar demasiado tiempo en esto aquí están los resultados.
Cuando el USB se pone en un modo de bajo consumo después de suspender con
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd){
.....
hpcd->Instance->CNTR |= USB_CNTR_FSUSP;
hpcd->Instance->CNTR |= USB_CNTR_LPMODE;
...
Hay un residuo restante ~200uA causado por un pin USB DM flotante. (Las entradas digitales flotantes consumen energía ( Implicaciones de las entradas CMOS lentas o flotantes )
La solución es usar/habilitar el circuito de detección de carga de la batería que está integrado en estos chips.
Algo como esto:
PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*)hUsbDeviceFS.pData;
USB_TypeDef *USBx = hpcd->Instance;
int stabilizationCounter = 0;
HAL_PCDEx_ActivateBCD(hpcd);
//run on a 10ms Timer
if( USBx->BCDR & USB_BCDR_DCDET ){
stabilizationCounter++;
if( stabilizationCounter >= USBPC_STABILIZATION_TIME ){
USBD_Start(&hUsbDeviceFS);
//stop the timer
}
}else{
stabilizationCounter = 0;
}
Nota: HAL tiene una void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd)
función, pero se espera que la llame usted mismo después de que se detecte la alimentación de VBus. Lo que significa que se usó un pin adicional y, en mi caso, una gran reorganización del diseño. Algunos detalles sobre el circuito recomendado del ST se encuentran aquí. Guías de PCB y hardware USB usando MCU STM32
Todavía hay unos 40uA causados por el LDO (~10uA) y una corriente de fuga inversa de un diodo Schottky (~30uA), pero eso al menos está documentado.
Es probable que tengas algún pin de entrada flotando. Esto hará que fluya una corriente "excesiva" en la etapa de entrada. Configure todos los pines como salida y jálelos para guardar niveles cuando vaya a dormir o asegúrese de que todos los pines de entrada estén en los niveles de voltaje adecuados. Tenga en cuenta que los pines de entrada tienen algo de corriente de fuga. Es decir, la resistencia pull-up/down tiene que ser lo suficientemente pequeña para seguir tirando a un nivel válido.
Bence Kaulics
dibosco
pkuhar
pkuhar
pkuhar
Bence Kaulics
pkuhar
pkuhar
chris stratton
pkuhar
Bence Kaulics
pkuhar