打印
[应用相关]

STM32L0低功耗设计——需求概述(转载)

[复制链接]
2794|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用芯片:STM32L053R8T6

    运行模式:

        Range 1:电源电压限制在1.71-3.6V,CPU最大运行频率为32MHz。

        Range 2:CPU最大运行频率为16MHz。

        Range 3:CPU最大运行频率4.2MHz


使用特权

评论回复
沙发
paotangsan|  楼主 | 2019-6-17 14:20 | 只看该作者
低功耗模式:

        Sleep mode(睡眠模式)、Low-power run mode(低功耗运行模式)、Low-power sleep mode(低功耗睡眠模式)、Stop mode with RTC(带有RTC的停止模式)、Stop mode without RTC(不带RTC的停止模式)、Standby mode with RTC(带有RTC的旁路模式)、Standby mode without RTC(不带RTC的旁路模式)。

        在上述这些模式中功耗依次降低,具体值为:

            Sleep mode:37uA/MHz

            Low-power run mode:8uA

            Low-power sleep mode:4.5uA

            Stop mode with RTC:1uA

            Stop mode without RTC:0.4uA VDD=3.0V

            Standby mode with RTC:0.85uA VDD=3.0V

            Standby mode without RTC:0.29uA VDD=3.0V


使用特权

评论回复
板凳
paotangsan|  楼主 | 2019-6-17 14:20 | 只看该作者
在上述这些模式中,使用时应注意以下几点:

            1、睡眠模式,在所有外设全部关闭的条件下,16MHz时,电流为1mA左右,这个数值相对自身的项目来说还是有些大;

            2、低功耗运行模式和低功耗睡眠模式,都限制了CPU的最大运行速度,如果CPU需要一直工作选择,该模式是比较合适的;

            3、停止模式,电流比较低,唤醒的方法也比较多;

            4、旁路模式,里面的RAM中的数据全部丢失,相当于复位重启。

        综上所述,停止模式是比较适合大部分项目的,我现在着手于选择停止模式,还完成后续的项目设计工作。


使用特权

评论回复
地板
paotangsan|  楼主 | 2019-6-17 14:20 | 只看该作者

Stop mode without RTC

        在停止模式时,RAM和寄存器中的数据全部保留。所有的时钟全部停止,包括PLL、MSI RC、HSI、LSI RC、HSE和LSE 。下图是我项目中用到的时钟的基本情况,仅使用了HSE和PLL。

  在stop运行模式时,一些具有唤醒功能的外设,当探索到唤醒条件时,能够使能HSI RC时钟。


        在stop运行模式时,电压稳压器处于低功耗模式。任何外部中断先,在3.5us的时间内即可唤醒器件,处理器将处理中断程序或执行后续代码。在STM32中,任何一个GPIO都可以设置为外部中断源,也就是说可以使用任何一个引脚的电平变化,来唤醒CPU。CPU也可以被USB/USART/I2C/LPUART/LPTIMER唤醒。


        在本项目中,我希望使用USART或者LPUART进行唤醒,在现阶段USART已经调通。



使用特权

评论回复
5
paotangsan|  楼主 | 2019-6-17 14:21 | 只看该作者
项目结构

        项目的大体结构为:12V给线路板供电,使用DCDC稳压到5V给无线传输模块供电,使用低压差线性稳压芯片稳压为3.3V给STM32L053R8T6供电。无线模块与STM32采用串口连接,平时STM32进入stop模式,当有无线模块发送过来的数据时,唤醒STM32。


使用特权

评论回复
6
paotangsan|  楼主 | 2019-6-17 14:21 | 只看该作者
当前功耗

        下面记录一下现阶段的功耗情况,后面慢慢加入。

        只焊接DCDC:232.7uA,此处说明DCDC在空载的情况下,功耗还是比较大的,我的项目限制于12V供电,所以没有太好的方法。如果不需要高电压,建议采用锂电池直接供电,这部分功耗就生下来了。

        DCDC两端加大电容:230uA,焊接电容后,由于仍然是空载状态,所以电路电流的下降是一个缓慢的过程,这和给电容的充电曲线是相符合的,最后停留在230uA左右,比不加电容还低3uA,这说明增加电容,可以增加DCDC的转换效率。

        简单程序正常运行:4.3mA,程序除了初始化相应的外设外,不进行任何逻辑操作。

        STM32处于STOP模式:236uA,板子上只有一个低压差的稳压芯片,没有焊接其它外设。

        STM32处于STOP模式(焊接无线模块):233uA,这个挺神奇的,当然我这个模块还没有进行软件设置,可是电已经供上了,表有问题?


使用特权

评论回复
7
paotangsan|  楼主 | 2019-6-17 14:22 | 只看该作者

继续项目的开发工作,突然发现,程序不能够正常下载到单片机中了,提示如下图所示的错误,我使用的是keil和ST-Link。


使用特权

评论回复
8
paotangsan|  楼主 | 2019-6-17 14:22 | 只看该作者
  这个问题在我第1次调试的时候发生过1次,我认为是我误操作将芯片烧坏了,因为当时又反复的焊接了一下芯片,也没有修好,就把这件事情放下了。

    今天再次出现,自己感觉可能和低功耗有关,仔细查看刚刚下载的程序,里面上来程序就进入低功耗,没有任何退出语句,所以应该是CPU不响应下载命令了。

    按照这种思路,先将单片机的复位引脚接地,然后点击下载按钮的同时,放开复位引脚,居然成功了。

    再仔细想不应该呀,ST-Link控制着复位引脚了,应该在下载的时候复位单片机才对呀。

    查看Keil中的ST-Link设置,有这样的设置,如下图所示,从英文字面理解真没有分清楚Pre-reset和under Reset,不过选用under Reset以后就正常了。





使用特权

评论回复
9
paotangsan|  楼主 | 2019-6-17 14:23 | 只看该作者
在12V输入端测量电流时,电流变化比较大,不能确认语句执行的有效性,所以在3.3V稳压前端接入电流表,以测量真实电流功耗。

    main函数中的程序,如下,程序一执行就进入Stop模式。

int main(void)
{
        Target.EnterStopMode();
        while(1)
        {
               
        }
}


使用特权

评论回复
10
paotangsan|  楼主 | 2019-6-17 14:23 | 只看该作者
EnterStopMode函数里面做的事情,也很简单,如下:

void CTarget::EnterStopMode(void)
{
  HAL_PWREx_EnableUltraLowPower();
  HAL_PWREx_EnableFastWakeUp();
  __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}


使用特权

评论回复
11
paotangsan|  楼主 | 2019-6-17 14:23 | 只看该作者
在main之前,按照ST公司的示例程序,进行了引脚配置,如下:

CTarget::CTarget(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        this->bMilliSecond_1000 = FALSE;
        this->bMilliSecond_100 = FALSE;
        this->bMilliSecond_10 = FALSE;
       
        /* Enable GPIOs clock */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();

  /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */
  GPIO_InitStructure.Pin = GPIO_PIN_All;
  GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);

  /* Disable GPIOs clock */
  __HAL_RCC_GPIOA_CLK_DISABLE();
  __HAL_RCC_GPIOB_CLK_DISABLE();
  __HAL_RCC_GPIOC_CLK_DISABLE();
  __HAL_RCC_GPIOD_CLK_DISABLE();
  __HAL_RCC_GPIOH_CLK_DISABLE();
}


使用特权

评论回复
12
paotangsan|  楼主 | 2019-6-17 14:24 | 只看该作者
按照上述程序是我现阶段能够测得的最低功耗:1.2uA,这与手册上给的0.4uA还是有差距的,考虑2点区别:

    1、我测量电流的位置在3.3V线性稳压前,3.3V线性稳压后,板子上实在不好接入电流表,就没有再测量;

    2、我使用3.3V,手册测得条件是3.0V

    也或许我程序还有需要改进的地方,不过这个数值已经能够满足项目的基本要求了,继续努力。


使用特权

评论回复
13
paotangsan|  楼主 | 2019-6-17 14:24 | 只看该作者
在进行低功耗设计时,使用外部中断唤醒CPU是一个非常有用而且有效的方法,但是在某些特定的应用中,我们还希望CPU能够自己醒来去完成一些特定的操作,这就需要用到RTC模块,因为RTC模块在CPU进入低功耗状态后,是还可以工作的。使用RTC,也需要得到一个最小时间间隔,一般我们将其设置为1秒,本文介绍如何设置RTC的这个最小时间间隔。

    先来看一下时钟图,RTC可以采用两个时钟模块,1个是外部的低频晶振,一般我们选择32.768KHz,这个比较精准;另一个则是内部的RC振荡器,是37KHz。



    STM32L0的预分频器被分成两个预分频器。一个7位的异步预分频器(AsynchPrediv),一个13位同步预分频器(SynchPrediv)。

    RTC频率的计算公式:RTCclk=(LSE或LSI)/[(AsynchPrediv+1)*(SynchPrediv+1)]。

    给出2组经典值:    LSE    RTCclk = 32768/(127+1)*(255+1)=1Hz    AsynchPrediv = 127    SynchPrediv = 255

                                  LSI     RTCclk = 37000/(124+1)*(295+1)=1Hz    AsynchPrediv = 124    SynchPrediv = 295


使用特权

评论回复
14
zzz316| | 2019-8-10 14:25 | 只看该作者
你好,问一下,串口2中断唤醒,你的能正常跑吗?在stop模式下,用串口唤醒,第一个字节是乱码。一直没有找到问题。所以想向你请教一下,我QQ号码是381631413.请问你联系方式是多少?可以交流一下吗?

使用特权

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

本版积分规则

53

主题

4119

帖子

0

粉丝