Cómo depurar STM32L433 fuga actual

6

Tengo una placa de circuito con STM32L433 que tiene alrededor de 320uA de consumo de corriente de línea de base en el modo STOP 2. Solo LSE con un cristal de 32 kHz está activo.

La placa tiene alimentación Vdda analógica separada que está desactivada para el modo de parada. (atado al suelo). Antes de deshabilitar Vdda, ADC, DAC y OPAMP se deshabilitan y sus pines se ponen en modo OD bajo.

La configuración se realizó con el software STM32CubeMX.

¿Alguna idea de cómo depurar esto? Desconecté y medí prácticamente todos los periféricos externos para ver qué es la corriente de dibujo, 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, que aún deja 300uA sin contabilizar.

EDIT:

~ 120uA de esto estaba usando STOP 0 en lugar de STOP 2. Esto fue dejado de alguna experimentación. Ahora estoy a 200uA. También he desconectado los chips BMI160 y DRV2603. Y 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 utilicé 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 el USB es el modo de bajo consumo. Esto causó el drow actual visto 200uA. Al tirar de este pin hacia abajo, se extrae el 200uA. Ahora estoy tratando de encontrar una manera de evitar esto en el firmware.

    
pregunta pkuhar

2 respuestas

6

Después de pasar demasiado tiempo en esto, aquí están los resultados.

Cuando el USB se pone en 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 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 función void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd) , pero se espera que lo llames tú mismo después de que se detecte la alimentación VBus. Lo que significa un pin extra usado y en mi caso una reorganización de gran diseño. Aquí hay algunos detalles sobre el circuito recomendado del ST Directrices de hardware y PCB USB que utilizan MCU STM32

Todavía tiene algunos 40uA causados por el LDO (~ 10uA) y una corriente de fuga inversa de un diodo Schottky (~ 30uA), pero al menos eso está documentado.

    
respondido por el pkuhar
3

Es probable que tengas algún pin de entrada flotante. Esto hará que la corriente "excesiva" fluya en la etapa de entrada. Configure todos los pines como salida y tire de ellos para ahorrar 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 las clavijas de entrada tienen alguna corriente de fuga. Es decir. la resistencia de subida / bajada debe ser lo suficientemente pequeña como para alcanzar un nivel válido.

    
respondido por el Attila Kinali

Lea otras preguntas en las etiquetas