如何调试STM32L433漏电流

2019-07-14 17:20发布

我有一块带STM32L433的电路板,在STOP 2模式下有大约320uA的基线电流消耗。只有具有32kHz晶振的LSE才有效。该板具有独立的模拟Vdda电源,在停止模式下被禁用。(与地面相连)。在禁用Vdda之前,ADC,DAC和OPAMP禁用,其引脚进入OD低电平模式。配置使用STM32CubeMX软件完成。任何想法如何调试这个?我断开并测量了几乎每个外围设备,看看是什么吸引电流,但似乎STM32L433是罪魁祸首。我用示波器测量电流,使用与电池串联的2欧姆电阻。LDO可能负责20uA,但是还有300uA却不明。我只用STM32L433和LDO LP5907-3.0以及几个去耦电容焊接了另一块电路板。同样的问题。这是我用来设置GPIO的最小代码
  1. <font size="4">GPIO_InitTypeDef GPIO_InitStruct;

  2. /* GPIO Ports Clock Enable */
  3. __HAL_RCC_GPIOC_CLK_ENABLE()
  4. ;
  5. __HAL_RCC_GPIOH_CLK_ENABLE()
  6. ;
  7. __HAL_RCC_GPIOA_CLK_ENABLE()
  8. ;
  9. __HAL_RCC_GPIOB_CLK_ENABLE()
  10. ;

  11. GPIO_InitStruct.Pin = 0xFFFFFFFF;
  12. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  13. GPIO_InitStruct.Pull = GPIO_NOPULL;
  14. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  15. HAL_GPIO_WritePin(GPIOA, GPIO_InitStruct.Pin, GPIO_PIN_SET);

  16. GPIO_InitStruct.Pin = 0xFFFFFFFF;
  17. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  18. GPIO_InitStruct.Pull = GPIO_NOPULL;
  19. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  20. HAL_GPIO_WritePin(GPIOB, GPIO_InitStruct.Pin, GPIO_PIN_SET);

  21. GPIO_InitStruct.Pin = 0xFFFFFFFF;
  22. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  23. GPIO_InitStruct.Pull = GPIO_NOPULL;
  24. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  25. HAL_GPIO_WritePin(GPIOC, GPIO_InitStruct.Pin, GPIO_PIN_SET);

  26. GPIO_InitStruct.Pin = 0xFFFFFFFF;
  27. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  28. GPIO_InitStruct.Pull = GPIO_NOPULL;
  29. HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
  30. HAL_GPIO_WritePin(GPIOH, GPIO_InitStruct.Pin, GPIO_PIN_SET);

  31. //BOOT0 PIN
  32. GPIO_InitStruct.Pin = GPIO_PIN_3;
  33. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  34. GPIO_InitStruct.Pull = GPIO_NOPULL;
  35. HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);


  36. HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);</font>
复制代码当USB输入处于低功耗模式时,USB DM引脚会浮动。这导致了200uA当前的卓尔精灵。向外拉这个引脚可以移除200uA。现在我正试图在固件中找到解决方法。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
denxinan
2019-07-15 12:28
结果是花了太多时间在这上面。

暂停后USB被置于低功耗模式

void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd){
    .....
    hpcd->Instance->CNTR |= USB_CNTR_FSUSP;
    hpcd->Instance->CNTR |= USB_CNTR_LPMODE;
    ...
浮动USB DM引脚会产生剩余的~200uA残余。(浮动数字输入消耗功率(慢速或浮动CMOS输入的影响)

解决方案是使用/启用内置于此芯片中的电池充电检测电路。

像这样的东西:

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;
}
注意: HAL确实有一个void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd)
功能,但是你应该在检测到VBus电源后自己调用它。这意味着使用额外的引脚,在我的情况下是一个大的布局重新洗牌。ST推荐电路的一些细节是使用STM32 MCU的USB硬件和PCB指南

LDO(~10uA)和肖特基二极管(~30uA)的反向漏电流仍然有40uA,但至少有文献证明。

一周热门 更多>