美文网首页
STM32L1XX系列低功耗

STM32L1XX系列低功耗

作者: lissettecarlr | 来源:发表于2021-04-08 17:03 被阅读0次

1电源管理

  • 上电复位 POR 参考

  • 掉电复位 PDR

  • 欠压复位
    使能BOR后POR和PDR的门限将被忽略,转而使用BOR设置的门限,BOR门限 在 option bytes中配置

模式 门限
1 1.8V上电 1.65V断电
2 2.1V上电 2.0V断电
3 2.4V上电 2.3V断电
4 2.7V上电 2.6V断电
5 2.9V上电 2.8V断电
  • 可编程电压监控 PVD

软件控制,监控VDD,门限可以设置在1.8-3.1间,100mV为间隔,当PVD大于或者小于门限则产生一个外部中断.

2低功耗模式

2.1低功耗运行模式

内核和外设都可以保存运行状态,需要配置内部电源变换器工作在低功耗模式下,系统时钟必须设置在128KHz一下,可以使用MSI作为系统时钟,内核供电必须选择供电范围2(1.5V),并且关闭动态电压调节功能

2.2睡眠模式

内核停止运行,外设保持运行.
通过特殊指令进入睡眠模式.
WFI由中断唤醒,任意的NVIC识别到外设中断都可以唤醒内核
WFE由事件唤醒,被配置为事件模式的EXTI中断唤醒内核

2.3低功耗睡眠模式

内核停止运行,外设保存运行

2.4停止模式

内核停止,内核电源范围内的时钟都停止,晶振也禁止,SRAM和寄存器内容保留。启动时需要重新配置时钟,并且清除标志位,唤醒后程序继续之前的运行。

2.5待机模式

电源内部变换器关闭、内核电源范围内全部断电,晶振被禁止,SRAM和寄存器不保留,RTC寄存器和备份寄存器保留。在待机模式下所有IO都保存高阻态,除了复位、RTC报警输出引脚、唤醒引脚,功耗典型值为1ua,但是如果对接了外部电路,不用配置引脚的优势也就变成了劣势,就如同我测试的SPI设备,待机模式的时候MOSI和SCK实际上是有电流的,功耗降不下去,这种时候选择停止模式,来单独配置IO口才行。

2.6 总结

image

3 代码与测试

测试硬件: 将STM32L151开发板上的多余器件全部去除
低功耗初始化函数

void low_power_init()
{
  /* Enable Ultra low power mode */
  HAL_PWREx_EnableUltraLowPower();
    
  /* Enable the fast wake up from Ultra low power mode */
  HAL_PWREx_EnableFastWakeUp();
    
    HAL_PWR_DisablePVD();
        
}

3.1待机模式(standby)

进入待机模式的代码,使用HAL库中的stm32l1xx_hal_pwr.c文件,下列中如果不进行清除标志位,则设备在第二次进入待机模式后将自动被唤醒。

void enter_standby_wakup()
{
        if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
        {
            /* Clear Standby flag */
            __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); 
        }
      HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
      __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
        
      HAL_PWR_EnterSTANDBYMode();
}

进入低功耗后所有引脚都会被置为高阻态,正常运行时功耗在10几mA,进入standby后电流下降到1~5uA左右,通过PA0上拉唤醒,该引脚也无需配置

3.2停止模式

代码使用了一个启动后常亮的引脚和一个外部中断按键,前者用于判断在进入停机模式后,引脚状态,结果是引脚仍然处于之前的状态,也就是寄存器被保持了。后者用于退出停机模式。

//该模式在退出时候必须重新配置时钟
//该模式需要在中断回调中添加
//__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

void enter_stop_exti()
{
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    SystemClock_Config();
}

如果单单进入停止模式,外部引脚是有可能消耗电量的,可用如下代码将全部引脚置为浮空输入,并且关闭GPIO时钟

  GPIO_InitTypeDef GPIO_InitStructure = {0};
  /* 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();

但并不是所有引脚都应该配置成浮空输入,对于一些特殊引脚可用在关闭时钟前进行单独配置,例如

~~~
        GPIO_InitStructure.Pin = GPIO_PIN_7;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
        GPIO_InitStructure.Pull = GPIO_PULLDOWN;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
~~~

停止模式并不会重启程序,被唤醒后将会继续执行之前的代码,也就是说引脚是应该被回复成被应用的状态,我们可以在将所有引脚配置成为浮空输入之前保存一下GPIO寄存器的值,然后在退出停止模式后,将保存的值再赋值给寄存器。

//读取当前GPIO状态
GPIO_TypeDef gpio_a;
GPIO_TypeDef gpio_b;
GPIO_TypeDef gpio_c;
GPIO_TypeDef gpio_h;
rt_memcpy(&gpio_a,GPIOA,sizeof(GPIO_TypeDef));
rt_memcpy(&gpio_b,GPIOB,sizeof(GPIO_TypeDef));
rt_memcpy(&gpio_c,GPIOC,sizeof(GPIO_TypeDef));
rt_memcpy(&gpio_h,GPIOH,sizeof(GPIO_TypeDef));

//复位IO
rt_memcpy(GPIOA,&gpio_a,sizeof(GPIO_TypeDef));
rt_memcpy(GPIOB,&gpio_b,sizeof(GPIO_TypeDef));
rt_memcpy(GPIOC,&gpio_c,sizeof(GPIO_TypeDef));
rt_memcpy(GPIOH,&gpio_h,sizeof(GPIO_TypeDef));

3.3 睡眠模式

睡眠模式能够被任意中断唤醒,也就是滴答定时器中断也能唤醒它,下列示例代码是在rtt系统下,在空闲回调里面添加进入休眠模式

void enter_sleep()
{
    /*Suspend Tick increment to prevent wakeup by Systick interrupt. 
    Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
    //HAL_SuspendTick();

    /* Enter Sleep Mode , wake up is done once Key push button is pressed */
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

    /* Resume Tick interrupt if disabled prior to sleep mode entry*/
    //HAL_ResumeTick();
}

void low_pwoer_hook_cb()
{
     //该回调未关闭滴答
   enter_sleep();
}

void low_power_set_idle_hook()
{
        rt_thread_idle_sethook(low_pwoer_hook_cb);
}

4 官方文档翻译

  • 芯片功耗典型值
    待机模式:0.28uA
    待机模式+RTC:1.11uA
    停止模式:0.44uA
    停止模式+RTC:1.38uA
    低功耗运行模式:10.9uA
    运行模式: 185uA/MHz

5 实际测试图

下图为STM32L151进入停止模式 和 SX1278进入休眠模式的功耗图


image.png

相关文章

  • STM32L1XX系列低功耗

    1电源管理 上电复位 POR 参考[http://www.go-gddq.com/html/FuWeiDian...

  • STM32L051低功耗STOP模式下RTC唤醒

    很多MCU都有低功耗模式,以满足对功耗要求苛刻的应用场景。STM32系列MCU的低功耗模式根据其内核与类型的不同也...

  • STM32L1XX系列IIC

    1 使用STM32CubeMx建立IIC工程 通用部分配置见软件使用 开启IIC,参数可默认image.png 将...

  • STM32L1XX系列的RTC

    1使用CubeMx对硬件RTC进行测试 我们手里的硬件有可能是开发板,有可能是自己画的板子,不管怎样,在编写一个功...

  • STM32L1XX系列的Flash

    stm32不同芯片种类对flash的分配情况都是有些许差别的,所以建议阅读芯片手册,这里将简述L1系列的flash...

  • XC6203E282PR应用

    XC6203E系列是采用CMOS和激光微调技术制造的高精度、低功耗正压稳压器。该系列提供大电流和显着小的dropo...

  • Android BLE低功耗蓝牙开发极简系列(二)之读写操作

    这是Ble极简系列的第二篇文章,上一篇Android BLE低功耗蓝牙开发极简系列(一)之扫描与连接主要是扫描连接...

  • stm32低功耗模式

    stm32f103系列有3种低功耗模式: 睡眠模式 停止模式 待机模式 从上往下功耗越低。 1. 睡眠模式 在睡眠...

  • 74系列集成型号大全

    74系列集成电路大致可分为6大类: 74××(标准型);74LS××(低功耗肖特基);74S××(肖特基);74A...

  • 锐炬Xe显卡的优势

    锐炬Xe显卡是Xe LP低功耗系列,也是被应用于11代NUC上的核显产品(Intel Iris Xe)。它较之此前...

网友评论

      本文标题:STM32L1XX系列低功耗

      本文链接:https://www.haomeiwen.com/subject/imormqtx.html