分享STM32的几种省电操作步骤

[复制链接]
 楼主| justperky 发表于 2015-9-16 09:26 | 显示全部楼层 |阅读模式
  进入SLEEP模式的省电操作
  1、为了降低系统功耗,进入SLEEP模式时,执行如下操作流程:
  关闭无需等待中断或事件的外设时钟;设置进入机制(Sleep-Now或Sleep-on-Exit);设置系统进入SLEEP模式。
  2、退出睡眠模式的方式:
  WFI(等待中断),可由任一外设中断触发,WFE(等待事件),可由任一外设事件触发。

 楼主| justperky 发表于 2015-9-16 09:27 | 显示全部楼层
  进入STOP省电模式的操作
  为了降低系统功耗,进入STOP模式的操作流程:
  关闭设置为普通IO功能的GPIO口时钟;
  关闭已开启时钟的外设的使能位(尤其是ADC、DAC、USB等带模拟模块的外设);
  关闭已开启时钟的外设的时钟;
  关闭预取缓冲区,并将Flash等待周期置为0;
  设置PWR_CR中LPDS位选择电压调节器的模式:
  正常模式:电压调节器处于正常供电状态;
  低功耗模式:可降低电压调节器自身的功耗,
  将MCU从STOP模式唤醒的时间有所增加;
  设置系统进入STOP模式。
 楼主| justperky 发表于 2015-9-16 09:27 | 显示全部楼层
  退出STOP省电模式的操作
  1、退出停止模式:
  以WFI进入时:任意外部中断线的中断;
  以WFE进入时:任意外部中断线的事件;
  不包括PVD和USB唤醒事件。
  2、从STOP模式恢复后,时钟的配置返回到复位时的状态(系统时钟为HSI),用户程序必须重新配置整个时钟系统,包括PLL。
王大熊 发表于 2015-9-18 08:49 | 显示全部楼层
学习了,这个资料很有借鉴意义
裁定心生 发表于 2015-9-19 08:45 | 显示全部楼层
这些都是操作寄存器的,没有操作库函数的步骤简介么
精彩人生sun 发表于 2015-9-19 22:14 | 显示全部楼层
讲的很详细,赞一个
打着哈欠说 发表于 2015-9-21 20:11 | 显示全部楼层
解释的很详细,对学习低功耗很有帮助
邓布利多 发表于 2015-9-22 15:18 | 显示全部楼层
不错,收藏了。
冒泡的鱼儿 发表于 2015-9-22 22:46 | 显示全部楼层
ST的低功耗没使用过,顶起来!
Thefantasy 发表于 2015-9-24 14:56 | 显示全部楼层
总结的很详细,很有帮助,谢谢了!
追逐浪花 发表于 2015-9-30 13:33 | 显示全部楼层
原来是用这种方式去减低功耗
不需要让芯片睡眠吗
shenmu2012 发表于 2015-10-7 17:18 | 显示全部楼层
justperky 发表于 2015-9-16 09:27
  进入STOP省电模式的操作
  为了降低系统功耗,进入STOP模式的操作流程:
  关闭设置为普通IO功能的 ...

该模式下这个最低功耗是多大的?
shenmu2012 发表于 2015-10-7 17:19 | 显示全部楼层
这几种低功耗模式的讲解和那有意义的,赞一个。不过希望给出个具体点的例程的更好的。
firstblood 发表于 2015-10-7 18:21 | 显示全部楼层
justperky 发表于 2015-9-16 09:27
  进入STOP省电模式的操作
  为了降低系统功耗,进入STOP模式的操作流程:
  关闭设置为普通IO功能的 ...

进入stop省电模式的,,看下我这是不是的啊:
void mcu_pwr_enter_stop_mode_set(void)
{     
          GPIO_InitStructure.GPIO_Pin =  0xffff;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;       
                GPIO_Init(GPIOB,&GPIO_InitStructure);
                GPIO_InitStructure.GPIO_Pin =  0xffff;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;       
                GPIO_Init(GPIOA,&GPIO_InitStructure);

                ADC1->CR2 &= 0xfffffffe;                  //ADON==0;          
          RCC_APB1PeriphClockCmd( RCC_APB1Periph_ALL, DISABLE);  
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_ALL, DISABLE );   
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE );
   
//                 RCC_HSEConfig(RCC_HSE_OFF);                       
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Disable);
                FLASH_SetLatency(FLASH_Latency_0);  
//     PWR_EnterSTANDBYMode();               
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

看有没有啥问题的啊
firstblood 发表于 2015-10-7 18:23 | 显示全部楼层
补充下: 我采用的是闹钟唤醒的————
void rtc_alarmtime_set(uint16_t cSleepTime)
{
    RTC_ClearFlag(RTC_FLAG_SEC);
//           while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);   /* Wait till RTC Second event occurs */
    RTC_SetAlarm( RTC_GetCounter()+ cSleepTime ); /* Alarm after  ms, interrupt every   s */
    RTC_WaitForLastTask();/* Wait until last write operation on RTC registers has finished */
}
也实现了,是可以的,,就是功耗的还是有点高的,,我测量的是整体功耗的,还有20uA 的,,有些高。。。
comeon201208 发表于 2015-10-7 18:49 | 显示全部楼层
楼上这个参考源代码的我参考下
angerbird 发表于 2015-10-7 20:44 | 显示全部楼层
说了这么多的,,想问下一般采用哪种省电方式比较合适呢?
smilingangel 发表于 2015-10-7 21:27 | 显示全部楼层
我用到的也是stop省电模式的,,那么其他的standby的模式呢?有没有哪位实际的应用过的?
baimiaocun2015 发表于 2015-10-11 20:32 | 显示全部楼层
firstblood 发表于 2015-10-7 18:23
补充下: 我采用的是闹钟唤醒的————
void rtc_alarmtime_set(uint16_t cSleepTime)
{

这个方法很不错的,我参考下。
tongbu2015 发表于 2015-10-15 21:34 | 显示全部楼层
这个非常好,省电模式是很多设计中都需要用到的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

181

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部