打印
[应用相关]

stm32 低功耗设计

[复制链接]
4652|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerful1|  楼主 | 2015-3-25 19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用STM32进行了一个低功耗应用设计,做一个小总结:
1、SLEEP 模式:很容易实现,可以由中断唤醒,但省电较少。这时候要配合时钟的关闭来节电:不需要用到的外设关闭时钟,要用到时才打开。例如USART:要发送数据前,把USART的时钟使能,数据包发送完成后,立即关闭时钟。
2、STOP 模式:需要外部中断唤醒。RTC报警唤醒给该模式带来了更加灵活的应用。但应用中有一个问题需要注意:在ADC数据采样的应用场合。如果使用STOP模式,假设采样率为200HZ,5毫秒唤醒一次启动ADC 采样,通过测试STOP唤醒的周期并不是很固定(可能是唤醒后需要恢复时钟设置,唤醒后自动使用内部的HSI时钟做为系统时钟),造成采样周期不是很固定,对滤波不利,例如工频陷波。
以上一点总结,希望对大家有用。
低功耗设计参考在ST官方提供的AN2821 Clock/calendarfunctionality features应用笔记中关于控制器从Stop modeStandby mode唤醒后的状态记录。官方原文: Stop mode After the microcontroller has exited the Stop mode,the basic reset and clock control circuitry (RCC)has to be reconfigured andaccess to the backup domain has to be re-enabled. Standby mode The Standby mode is the lowest power consumptionmode. After the microcontroller wakes up from the Standby mode, programexecution restarts in the same way as after a system/power reset. 译文: Stop mode:当控制器从Stop mode中唤醒后,RCC必须重新配置并且需要再次使能对备份区的访问。 Standby mode:当控制器从Standby mode中唤醒后,控制器将被复位,程序也将从复位后的地址开始执行
沙发
powerful1|  楼主 | 2015-3-25 19:37 | 只看该作者
STM32低功耗实验总结
1
首先回答一个问题,STM32能不能做低功耗?
回答是肯定的,这个是有数据支持的,我测试的STM32101CBFLASH128KRAM16K并且RTC工作的情况下,测试到的功耗为16uA应该说还是相当不错的。
2
STM32低功耗有哪些需要注意的地方?
一开始我测试到STM3216uA的时候,还是非常高兴的,以为真的可以做为我的应用,我的应用是让MCU定时醒来干活,干一会就睡觉,可能干活的时间就几十个毫秒。可是后来发现有些问题(工作在STOP模式):
1
时钟问题:STM32被唤醒以后的时钟自动切换到内部HIS RC振荡器,大家都是知道的,RC振荡器的精度是不高的。而且,睡觉前对于时钟的设置都是恢复到复位状态,只是时钟这个地方复位,其他的没有。这也会带来一个问题,可能你睡觉前使用的是内部时钟,可是睡觉后,时钟却变了,带来的问题就是UART和定时器。或许你想不使用PLL,就是8M,这样醒来后的时钟HIS也是8M,这样虽然在时钟上没有差别了,但是时钟却不稳定了。UART波特率肯定不能太高,否则通信会有问题。
2
醒来时间:这个问题也是个非常大的问题,datasheet上给出的醒来时间是7us,这个可能真的不假,但是醒来,不能马上干_你的活,为什么。初始化IO,你可能问,我不初始化不行吗,回答应该是否定的。因为,如果你想使用低功耗的话,睡觉前IO口都应该设置为模拟输入,这样才能达到datasheet上的14uA,但是这样也带来一个问题,那就是初始化IO,醒来必须要初始化IO。如果你还想把时钟切换到外部时钟,耗时会更加长,接近200ms,因为STM32会等待外部时钟稳定后才能工作,然后还要在重新初始化所有IO,这个非常的耗时。可能我只需要醒来10ms,但是这些活干完就需要100ms
3
RTC唤醒:RTC这个也是个问题,为什么?大家需要注意的是RTC只能使用报警才能唤醒MCU,秒中断是不可以唤醒的。并且报警中断必须不停的设置,设置一次只生效一次,中断完了,还需要设置下次中断的时间。并且还有个问题,报警中断必须等待到秒中断到了之后才能设置,也就是正好秒寄存器更新了一次的时候设置,这就带来一个问题,等待秒中断。如果睡前还想再能被报警唤醒的话必须重新设置报警中断,而且设置报警中断的时候需要等到秒中断才能设置新的值。这个等待的时间是不定的。可能会几百个毫秒。说以要空空的耗费几百个毫秒等到秒中断标志来设置报警中断。可能我的MCU只需要执行10ms就需要睡觉了。还是要空空的耗费掉几百个毫秒
总结:在使用的过程中发现的问题,我都在上面说明了,我觉得STM32的低功耗太假,虽然在睡眠的时候性能不错,但是醒来,和进入睡眠的设置太麻烦,耗时太多,这是个弊端,我觉得MSP430估计是做的最好的了,即使是AVR也比他好点,没有那么麻烦。

使用特权

评论回复
板凳
powerful1|  楼主 | 2015-3-25 19:38 | 只看该作者
我用STM8S103F2(或者F3)时候用的低功耗模式是停机模式,唤醒源是外部中断,但是没有对IO重新初始化,时钟是内部16MRC,唤醒后没有发现什么问题,停机模式下功耗是6uA3.6V),另外睡觉的时候把所有的IO都设置为输入了
用内部RC唤醒是起振时间短,功耗低。

2
、为何用HSI的时候不做GPIO初始化。切换CLK source,只是写个寄存器,硬件去切换,稳定以后,硬件给出标志位,MCU查标志即可,这个时间断死等标志不是浪费了时间?

3
、很想知道哪家的MCU唤醒时用的是外部晶振。

使用特权

评论回复
地板
powerful1|  楼主 | 2015-3-25 19:40 | 只看该作者
1、   Microchip的LPX号称最低功耗可以做到pA,Ti呢?

遇到的大部分要求低功耗的场合往往要求是随眠的时间远远大于工作的时间,所以大部分做低功耗的讲自己省电都是讲深度睡眠的功耗。
1、用内部RC唤醒是起振时间短,功耗低。

2
、为何用HSI的时候不做GPIO初始化。切换CLK source,只是写个寄存器,硬件去切换,稳定以后,硬件给出标志位,MCU查标志即可,这个时间断死等标志不是浪费了时间?

3
、很想知道哪家的MCU唤醒时用的是外部晶振。  


使用特权

评论回复
5
powerful1|  楼主 | 2015-3-25 19:40 | 只看该作者
对于上面的回答:
1
、这个我承认,内部RC起振的确时间很短,这个我使用的STM32101CB5.4uSdatasheet上面说的。这个我也没有办法测试。但我相信这个数据是真实可靠的,肯定是经过测试的。
2
、对于第二条,Grant 的确给我提供了一个思路,切换CLK的时候,初始化GPIO,非常的感谢。
   
但是我想问一下Grant ,关于你说的
  “
切换CLK source,只是写个寄存器,硬件去切换,稳定以后,硬件给出标志位,MCU查标志即可
   
我想知道的是这个时间是多少?可否具体的测试过,我是测试过的,大约需要几十个毫秒,这一点,没有AVR做的好,AVR我使用的  ATmega88,可以4.5ms稳定时钟。MSP430就更不要比了,不是一个数量级上的。MCU稳定CLK的时间,按道理我的活都应该干完的。我只需要醒来几个毫秒通信一下,就睡觉了,可是大量的时间浪费在了稳定CLK上。电也白白耗了,因为我使用的电池供电,功耗要求非常高。
3
、第三个问题,Grant 说的是正确的,我所接触到的单片机唤醒时候的时钟都是先使用内部的,但是别的单片机切换时钟的速度很快,我不得不说一下MSP430,STM32系列的我感觉这块还需要努力!
4
、还有一个很大的问题,为什么RTC只能报警中断才能唤醒他(我只说的是RTC部分),其他的RTC中断就不能唤醒呢,而且报警中断设置的时候还必须等待秒中断标志置位才能设置,浪费了多少时间。如果Grant有能定时唤醒MCU的方法,前提不能加其他的器件,而且不浪费时间,请你一定告诉我,我如果这个问题能解决,我肯定会在我的项目中使用STM32的。

使用特权

评论回复
6
powerful1|  楼主 | 2015-3-25 19:41 | 只看该作者
楼主非得这么用么?
比如MP3的主控芯片是STM32,那么在关机的时候相当于休眠,我开机的时候,是不会在意等那个几百ms的。
你非要关10ms,开10ms,那就没辙了。总之办法是人想出来的,看你怎么用吧。
楼主 要用到RTC唤醒,我一般用的WK_UP引脚唤醒。还有STM32的最低功耗是待机模式,而不是停止模式!
我不晓得使用WK_UP引脚是不是就可以定时唤醒,不加外设的情况下,好像我没有看过,我再仔细查一下,避免犯了以一概全的错误,不能对STM32全盘否定啊,如果其他的朋友知道,我就想我的单片机能定时醒来,比如,睡觉5秒,醒来10毫秒,在不加外设,因为成本控制的非常严格,是不是可以实现定时醒来。
为了响应快,功耗低,一般MCU都是先起RC;事件响应程序根据具体情况,决定是否需要起外部OSCPLL,还是直接处理完成回到休眠。

如果需要启动HSEPLL,那肯定要异步。而且,STM32时钟管理也提供了很多中断。HSEPLL的控制,通过时钟控制模块的中断去实现。全事件驱动。主程序只要在用到指定时钟之前同步上就行。

你的测试,可能把晶振的起振时间算上了。起振过程中是可以干别的事情的。两个稳定的时钟切换,一般也就几个低速时钟的周期。。。
具体的测试方式方法,需要明确。

STM32
有一个电池备份域,有一些数据寄存器是电池持续备份的。看你的数据是否足够少。
海量SRAM内容的保持和休眠低功耗自身就是矛盾的,如果有大量数据保持的工作,考虑FRAM把。
计算上起振时间肯定是要的,我对这个稳定时间也很敏感!

我没有海量的SRAM数据需要存储,但是备份区字节肯定不够的,并且FRAM我这个东西的成本不能让我奢侈这样的东东。
起振/稳定时间我没调研过,不过印象中这点MSP确实是很强的。

由于起振的时间可以和很多初始化/计算Overlay,不一定是一个很强的要求。而且总功耗是否划算,没有具体测量,不好说。
除非应用要求准确时钟,比如UART,那真没太好办法了。
没有特别的要求,考虑某件事情总能量,可能更好一点。

如果数据不是经常改,考虑烧Flash?这样用个小容量RAM的型号,多少还能再省点。
拿数据生命周期内的总能量需求考察,写Flash的能耗不一定是亏的。

使用特权

评论回复
7
powerful1|  楼主 | 2015-3-25 19:42 | 只看该作者
拿到STM32L的样片后,一直纠结于低功耗的测试,因为和STM32F系列的配置不同,所以导致了杯具,通过和ST公司不停的咨询,终于得到了最终的结果,
经过测试,功耗在STOP模式下为 500nA ,性能还是不错的,代码如下:

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32l1xx_md.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32l1xx.c file
     */
     /* Configure all unused GPIO port pins in Analog Input mode (floating input
     trigger OFF), this will reduce the power consumption and increase the device
     immunity against EMI/EMC *************************************************/
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC

                        | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH, ENABLE);

    /* config all IO to Analog Input to reduce parasite power consumption */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_Init(GPIOE, &GPIO_InitStructure);

    GPIO_Init(GPIOH, &GPIO_InitStructure);

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_Init(GPIOB, &GPIO_InitStructure);  

    /* Enable PB7 as external PVD input so as to set it as AIN_IN */
    Set_PVD_To_Config_PB7();

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA  
                          | RCC_AHBPeriph_GPIOB
                          | RCC_AHBPeriph_GPIOC
                          | RCC_AHBPeriph_GPIOD
                          | RCC_AHBPeriph_GPIOE
                          | RCC_AHBPeriph_GPIOH, DISABLE);
     
    PWR_UltraLowPowerCmd(ENABLE);
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
    while(1);
}
/**
  * @brief  Enable PB7 as external PVD input so as to set it as AIN_IN
  * @param  None
  * @retval None
  */
void Set_PVD_To_Config_PB7(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  /* Configure the PVD Level to 3 (2.5V) */
  PWR_PVDLevelConfig(PWR_PVDLevel_7);

  /* Enable the PVD Output */
  PWR_PVDCmd(ENABLE);   
}

使用特权

评论回复
8
搞IT的| | 2015-3-26 13:07 | 只看该作者
收藏了,不错啊!

使用特权

评论回复
9
cowboy2014| | 2015-3-30 17:30 | 只看该作者
那个TI的msp430比如何呢?
那个可是直接称作是低功耗产品

使用特权

评论回复
10
mahongtu| | 2016-1-7 10:39 | 只看该作者
powerful1 发表于 2015-3-25 19:42
拿到STM32L的样片后,一直纠结于低功耗的测试,因为和STM32F系列的配置不同,所以导致了杯具,通过和ST公司 ...

非常感谢你的参考
我试了下,7uA左右,和你不同的是,我保留着PA13,PA14(也就是SWD的调试接口没动)
担心动了以后,就不能下次下载程序了,还有就是板载一个3.3转3V的LDO,给VDDA供电

使用特权

评论回复
11
mahongtu| | 2016-1-11 14:31 | 只看该作者
powerful1 发表于 2015-3-25 19:42
拿到STM32L的样片后,一直纠结于低功耗的测试,因为和STM32F系列的配置不同,所以导致了杯具,通过和ST公司 ...

有个问题请教下,为啥一定要PVD设置到level7,我改别的设置,对功耗产生了影响

使用特权

评论回复
12
huangcunxiake| | 2016-1-11 17:20 | 只看该作者
STOP 模式:需要外部中断唤醒。RTC报警唤醒给该模式带来了更加灵活的应用。但应用中有一个问题需要注意:在ADC数据采样的应用场合。如果使用STOP模式,假设采样率为200HZ,5毫秒唤醒一次启动ADC 采样,通过测试STOP唤醒的周期并不是很固定(可能是唤醒后需要恢复时钟设置,唤醒后自动使用内部的HSI时钟做为系统时钟),造成采样周期不是很固定,对滤波不利,例如工频陷波。
要给你点赞啊,好几个人问这个问题。

使用特权

评论回复
13
moyanming2013| | 2016-1-11 17:48 | 只看该作者
cowboy2014 发表于 2015-3-30 17:30
那个TI的msp430比如何呢?
那个可是直接称作是低功耗产品

同问这个

使用特权

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

本版积分规则

88

主题

430

帖子

4

粉丝