打印

请教一下STM32的低功耗问题

[复制链接]
9411|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leewen|  楼主 | 2008-7-10 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32进入STOP Mode的PWR_Regulator_LowPower时,MCU消耗的电流会有多大?我现在平台上有10mA左右电流。对于GPIO口要如何设置还能降低功耗或者说其他什么方法?谢谢先。
沙发
ST_ARM| | 2008-7-11 09:53 | 只看该作者

进入STOP模式前的相关操作

进入STOP模式前,需要对相应的用于通用的GPIO进行设置,对输出的口写入对应的电平,使其不出现Vcc对GND的现象,可以设为:Vcc-Vcc、GND-GND。
对不用GPIO口最好关闭其时钟。将系统时钟切换到HSI,然后进行如下设置:

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);    // Disable Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_0);    // Flash 0 wait state
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);

使用特权

评论回复
板凳
leewen|  楼主 | 2008-7-11 11:43 | 只看该作者

进入STOP前我这么做的

 // 将GPIO进行设置。如果我将所以IO设置成INPUT FLOATING,消耗电流为10.38mA,如果对相应的输出口按楼上的进行设置,大概有11mA .
 vSetPort2PwrSaveMode();  
// 关闭所有的外设时钟   
  vPeriphClockCmd(DISABLE);    

  /* HCLK = SYSCLK */
  RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  RCC_PCLK2Config(RCC_HCLK_Div2);             
  RCC_PCLK1Config(RCC_HCLK_Div4);

  /* Select HSI as system clock source */
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

  /* Wait till HSI is used as system clock source */
  while(RCC_GetSYSCLKSource() != 0x00)
  {
  }

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);  
  FLASH_SetLatency(FLASH_Latency_0);

  /* Request to enter STOP mode with regulator in Low Power */
  PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
现在消耗的电流还是有10mA左右。究竟是哪里有问题呢?

使用特权

评论回复
地板
香水城| | 2008-7-11 11:55 | 只看该作者

你应该测量STM32的VDD管脚,不应把不在STM32上消耗的电流算进

最好有线路图才好深入讨论。

我们测过,在所有STM32的I/O脚悬空时,STM32上消耗的电流符合数据手册的指标。

使用特权

评论回复
5
ST_ARM| | 2008-7-11 16:38 | 只看该作者

你遗漏了一个关键性的东西

你关闭了所有的外设的时钟,同时也关闭了设置STM32进入STOP模式的时钟,添加下面一行代码:

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // Enable PWR clock

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);  
  FLASH_SetLatency(FLASH_Latency_0);

  /* Request to enter STOP mode with regulator in Low Power */
  PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

使用特权

评论回复
6
leewen|  楼主 | 2008-7-14 20:36 | 只看该作者

按楼上的加了还是一样的

我在我上面代码
// 关闭所有的外设时钟   
  vPeriphClockCmd(DISABLE);    
后再加上
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//Enable PWR clock
还是没什么变化。
系统在进入STOP模式前和STOP模式后,电流只减少了50mA左右。
请问系统在这种模式下前后应该会减少多少电流呢?

使用特权

评论回复
7
leewen|  楼主 | 2008-7-14 21:24 | 只看该作者

RE

不好意思。说错了,不是50mA.
系统按照 // 将GPIO进行设置。如果我将所以IO设置成INPUT FLOATING,消耗电流为10.38mA,如果对相应的输出口按楼上的进行设置,大概有11mA .
vSetPort2PwrSaveMode();  
// 关闭所有的外设时钟   
  vPeriphClockCmd(DISABLE);    
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//Enable PWR clock
  /* HCLK = SYSCLK */
  RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  RCC_PCLK2Config(RCC_HCLK_Div2);             
  RCC_PCLK1Config(RCC_HCLK_Div4);

  /* Select HSI as system clock source */
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

  /* Wait till HSI is used as system clock source */
  while(RCC_GetSYSCLKSource() != 0x00)
  {
  }

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);  
  FLASH_SetLatency(FLASH_Latency_0);

  /* Request to enter STOP mode with regulator in Low Power */
  PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
 
进入STOP模式时,就STM32而言,其本身消耗的电流是多少。

使用特权

评论回复
8
ST_ARM| | 2008-7-15 10:21 | 只看该作者

代码没有问题

进入STOP模式时,就STM32而言,其本身消耗的电流是14uA。

可能是你的板子上有其他芯片等还在耗电。

使用特权

评论回复
9
leewen|  楼主 | 2008-7-16 18:47 | 只看该作者

re

谢谢大家的帮忙。现在整个系统已经降到1mA左右了。还在努力中。

使用特权

评论回复
10
香水城| | 2008-7-16 18:56 | 只看该作者

恭喜,请楼主分享降功耗心得

使用特权

评论回复
11
leewen|  楼主 | 2008-7-16 22:09 | 只看该作者

re

主要还是跟我现在的板子有关,就是要排除掉MCU外围的一些电路的消耗。代码还是按上面的

使用特权

评论回复
12
wwomee| | 2012-5-24 10:51 | 只看该作者
楼主是怎么从10MA降到1MA的呢?我这里还是10+MA

使用特权

评论回复
13
wwomee| | 2012-5-24 15:05 | 只看该作者
楼主有在么?如果有时间的话加下我QQ 316645339

使用特权

评论回复
14
行不改名| | 2012-5-24 19:53 | 只看该作者
以前实测过进入STOP时的电流记得是几十个UA。

使用特权

评论回复
15
liguang02| | 2014-8-22 22:36 | 只看该作者
我的也是10ma啊,怎么降低功耗的,是不是也要把那个调试功能关闭

使用特权

评论回复
16
icecut| | 2014-8-23 09:50 | 只看该作者
板子设计很重要.一不小心一个电阻就干掉了很多功耗

使用特权

评论回复
17
hugo0chen| | 2016-8-5 14:10 | 只看该作者
本帖最后由 hugo0chen 于 2016-8-5 14:13 编辑

0、设置IO的中断输入触发方式为falling 触发;
电路:使用ldo产生3.3V供电给stm32f103rbt6,最小系统,reset电路;boot0 通过10kohm电阻下拉到GND;Vbat未连接;VDD1-VDD2-VDD3_Vdd4以及VDDA都是连接到3.3V 上;无外部crystal;
测量方法:测量位置是3.3V进入mcu最小系统串接进去的
测量工具:电流表ua tester QH-05 Ver 1.5,配合的万用表是 victor VC890D 使用200mv档;

软件测试
系统上电后进入systeminit(),设置时钟是HSI;--->
初始化一个gpioB.9作为输出,驱动LED点亮指示;--->
初始化一个GPIOB.6作为输出中断,进入stop模式使用---->
在while(1)中,执行LED_ON(LED_NO_1);---->
在EXTI中断函数中,LED_OFF(LED_NO_1),且执行Enter_StopMode(),
Enter_StopMode()__--->>
1、在进入stop模式前,GPIO设置为AIN模式;
2、关闭所有时钟GPIO、AFIO、SRAM以及FLITF时钟,但是使能PWR_Regulator clock
3、disable flash prefetch buffer;
4、进入low power 的stop 模式。PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
测试结果
可以进入stop模式,我用led灯指示,进入后led熄灭。
测量的电流时0.4mA。为什么还这么高?

附code:
/********************************* STOP MODE **********************************/  
void Stop_MODE(void)
{
  /* Config the GPIO on Analog Input mode  disable all gpio clock and afio*/
  GPIO_Config_ALL_AIN();

  /* Desable the SRAM and FLITF clock in Stop mode */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM|RCC_AHBPeriph_FLITF, DISABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // Enable PWR clock
         
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);    // Disable Prefetch Buffer
        FLASH_SetLatency(FLASH_Latency_0);    // Flash 0 wait state
        
    /* Mode: STOP + Regulator in low power mode + Entry with WFI */
        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
}

static void GPIO_Config_ALL_AIN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Disable the Serial Wire Jtag Debug Port SWJ-DP */
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
      /* PB  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
      /* PC  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
        /* PD  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA   | RCC_APB2Periph_GPIOB
                         | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO
                         , DISABLE);
                                                                                                
        RCC_HSICmd(DISABLE);
        RCC_LSICmd(DISABLE);
        RCC_HSEConfig(RCC_HSE_OFF);
        ADC_Cmd(ADC1,DISABLE);
        ADC_Cmd(ADC2,DISABLE);
}
        

使用特权

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

本版积分规则

45

主题

102

帖子

2

粉丝