打印

STM32L433 使用sleep模式,电流太大

[复制链接]
1657|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用STM32L433电路板,使用例程检测到电流达不到手册上的值

检测结果

代码例程为:



/****************************************************************************
* 名    称: void LowPower_Config(void)
* 功    能: 低功耗初始化
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void LowPower_Config(void)
{
__HAL_RCC_PWR_CLK_ENABLE(); // 运行电源管理时钟

#ifdef __rtc_H
// 低功耗模式下RTC 允许访问 ,RTC唤醒需要
HAL_PWR_EnableBkUpAccess();
// 禁止唤醒时钟计数
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
#else
// 修改RTC时钟时钟源
RCC_PeriphCLKInitTypeDef PeriphClkInit;
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_NONE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
  _Error_Handler(__FILE__, __LINE__);
}

__HAL_RCC_RTC_DISABLE();  // 先暂停备份区域内的RTC时钟
__HAL_RCC_RTCAPB_CLK_DISABLE(); // 再暂停APB总线上的RTC时钟
HAL_PWR_DisableBkUpAccess(); // 最后才暂停整个备份区域的时钟
#endif

// 禁止 PVD
HAL_PWR_DisablePVD();

// 禁用Flash预存取,降低性能,降低功耗
__HAL_FLASH_PREFETCH_BUFFER_DISABLE();
// Sleep模式下,可以Flash进入低功耗模式
__HAL_FLASH_SLEEP_POWERDOWN_ENABLE();

// 关闭VREFINT 少3uA
// HAL_PWREx_EnableUltraLowPower();
// 忽略VREFINT 加快启动速度
// HAL_PWREx_EnableFastWakeUp();

// 唤醒后选择哪个启动时钟源
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI);

// 降低核心工作电压,需要根据实际工作频率设置,建议在Cubemx内的RCC项目中配置
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

// 优先停用不需要的GPIO时钟
__HAL_RCC_GPIOC_CLK_DISABLE();
#if defined (__STM32L0xx_HAL_H) || defined (__STM32L1xx_HAL_H) || defined (__STM32L4xx_HAL_H)
__HAL_RCC_GPIOH_CLK_DISABLE();
#endif


//________________________ L4特用功能 Sleep、Stop模式下允许个总线上的外设时钟
#if defined (__STM32L4xx_HAL_H)
// 初始化先设置全部禁用
RCC->AHB1SMENR  = 0x0;
RCC->AHB2SMENR  = 0x0;
RCC->AHB3SMENR  = 0x0;

RCC->APB1SMENR1 = 0x0; //RTC
RCC->APB1SMENR2 = 0x0;
RCC->APB2SMENR  = 0x0;

#ifdef __rtc_H
__HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE(); // Sleep、Stop模式下 使能RTC时钟

#endif
//定义 Sleep、Stop模式下 使能外设时钟
// __HAL_RCC_PWR_CLK_SLEEP_ENABLE();
// __HAL_RCC_USART1_CLK_SLEEP_ENABLE();
//
// __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE();
// __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE();
// __HAL_RCC_LCD_CLK_SLEEP_ENABLE();

//________________________ L4特用功能 Standby和Shutdown保存IO输出电平
#ifdef __BSP_LPUSART__
__HAL_RCC_LPUART1_CLK_SLEEP_ENABLE();

// 需要保持 RX上拉高电平,否则造成灌流或者FE错误
GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// LPUSART 唤醒只能选用 HSI 或 LSE
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
#else
HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_A, PWR_GPIO_BIT_0 | PWR_GPIO_BIT_14 |PWR_GPIO_BIT_9 | PWR_GPIO_BIT_10); // 保持key1和SWDCLK的电平
HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_A,  PWR_GPIO_BIT_13 ); // 保持串口和SWDIO的电平
HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_B,PWR_GPIO_BIT_1);// 保持LED电平
HAL_PWREx_EnablePullUpPullDownConfig();
#endif

#endif
}






不知道什么原因,请各位大神帮我解答一下疑惑~~ 跪谢






使用特权

评论回复

相关帖子

沙发
dirtwillfly| | 2020-6-4 20:06 | 只看该作者
测低功耗电流不能用万用表的,万用表测出来是有效值。
你需要观察的是处于sleep时候的电流,不包括被唤醒工作期间的电流

使用特权

评论回复
板凳
yueguang3048| | 2020-6-5 09:03 | 只看该作者
1.手册的目的是给你说,看,我可以到达这样的功耗。
2.功耗调试可不是全是看手册的,跟你外围电路也有关,所以得贴出外围电路。
-----------------------------------
个人见解:提问具体些,归纳出重点,把东西在上面一贴一堆,然后求大家帮忙,感觉有些欠缺。

使用特权

评论回复
地板
qwepk120|  楼主 | 2020-6-5 09:39 | 只看该作者
dirtwillfly 发表于 2020-6-4 20:06
测低功耗电流不能用万用表的,万用表测出来是有效值。
你需要观察的是处于sleep时候的电流,不包括被唤醒工 ...

很感谢你能帮我解决问题,我刚接触这个,有点不太理解,我这个电流是,写了SLEEP模式,然后再去测电流值,这样是不对的嘛,需要怎么样测,使用的是一个STM32L433的开发板,其他电路都没有使能,再没有进入SLEEP模式的时候,我这边的电流是13mA,进入之后能到4mA,但是远远达不到我要的uA

使用特权

评论回复
5
qwepk120|  楼主 | 2020-6-5 09:45 | 只看该作者
yueguang3048 发表于 2020-6-5 09:03
1.手册的目的是给你说,看,我可以到达这样的功耗。
2.功耗调试可不是全是看手册的,跟你外围电路也有关, ...

太感谢你能指点我的错误,我会改正的。我贴出来的是为了,让你们能帮我看一下是否有错误。我用的是开发板,什么都没有使能,就直接进入sleep模式,这样也与外围电路有关吗,我对这个不太理解,麻烦您为我解惑一下。我这边的正常电流是13mA,进入sleep模式之后能到4mA,但是远远达不到我要的uA

使用特权

评论回复
6
dirtwillfly| | 2020-6-5 12:21 | 只看该作者
qwepk120 发表于 2020-6-5 09:39
很感谢你能帮我解决问题,我刚接触这个,有点不太理解,我这个电流是,写了SLEEP模式,然后再去测电流值 ...

要注意单位,这个功耗单位是uA/MHz,sleep的工作电流是和运行主频成正比的。

使用特权

评论回复
7
dalarang| | 2020-6-5 13:54 | 只看该作者
1、检查外围电路的耗电情况
2、移除仿真器
3、IO口尽量都设为输出模式
4、检查IO口是否有和输出相反的上下拉

使用特权

评论回复
8
qwepk120|  楼主 | 2020-6-5 14:13 | 只看该作者
dirtwillfly 发表于 2020-6-5 12:21
要注意单位,这个功耗单位是uA/MHz,sleep的工作电流是和运行主频成正比的。 ...

请原谅我这个小白的不理解,这个还是有点不懂,如果用uA测的话就是3800多uA

使用特权

评论回复
9
qwepk120|  楼主 | 2020-6-5 14:16 | 只看该作者
dalarang 发表于 2020-6-5 13:54
1、检查外围电路的耗电情况
2、移除仿真器
3、IO口尽量都设为输出模式

很感谢您的回答
如果是外围的好点,可能我这边就还有一个指示灯会亮着。
移除仿真器的意思,直接用USB供电是吗,我现在用的是STlink供电
IO口的话,我这边没有使用其他的IO口,没有使用就不用设为输出模式了?

使用特权

评论回复
10
dalarang| | 2020-6-5 14:50 | 只看该作者
qwepk120 发表于 2020-6-5 14:16
很感谢您的回答
如果是外围的好点,可能我这边就还有一个指示灯会亮着。
移除仿真器的意思,直接用USB供 ...

我不知道你是怎么去测量电流,仿真器连接到MCU的SWD口可能会消耗一点电流。
另外IO口设为OUT的目的是防止IO口悬空,悬空可能会导致额外的电流消耗,如果你某些IO口是有明确输入用的,那可以不用设OUT。我们一般做低功耗应用时都会将不使用的IO口都设为OUT模式,防止悬空电平跳转额外消耗电流。以前用MSP430按照一定的规范要求做很容易做到几个uA的待机功耗。
不过你这几个mA应该是其它方面引起的,估计就是指示灯消耗的吧

使用特权

评论回复
11
tom_xu| | 2020-6-5 15:25 | 只看该作者
一个指示灯就2~3个毫安了吧。

使用特权

评论回复
12
qwepk120|  楼主 | 2020-6-5 17:11 | 只看该作者
dalarang 发表于 2020-6-5 14:50
我不知道你是怎么去测量电流,仿真器连接到MCU的SWD口可能会消耗一点电流。
另外IO口设为OUT的目的是防止 ...

我这边将所有的IO都设为了OUTput模式,但是没有什么变化,然后我不用STlink供电,减少了一点电流,但是电流还是在5.3mA左右。

使用特权

评论回复
13
qwepk120|  楼主 | 2020-6-5 17:13 | 只看该作者
tom_xu 发表于 2020-6-5 15:25
一个指示灯就2~3个毫安了吧。

这个指示灯是,一接上电就有的

使用特权

评论回复
14
tom_xu| | 2020-6-6 14:51 | 只看该作者
qwepk120 发表于 2020-6-5 17:13
这个指示灯是,一接上电就有的

可以把这个指示灯焊下来,看看是不是减少了?

使用特权

评论回复
15
qwepk120|  楼主 | 2020-6-10 10:17 | 只看该作者
tom_xu 发表于 2020-6-6 14:51
可以把这个指示灯焊下来,看看是不是减少了?

好的,我再测试一下,非常感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

48

帖子

0

粉丝