xuxi131 发表于 2015-12-4 08:43:32

【NUCLEO-L476RG开发】STM32L476低功耗模式初试


【NUCLEO-L476RG开发】STM32L476低功耗模式初试

   在项目开发中经常用到低功耗MCU芯片,今用st币换到了一块STM32L476RG-NUCLEO开发板,由于本人对STM32CubeMx和
HAL库不熟悉,没有使用过,但对此板的低功耗比较感兴趣,还是花时间看了一点资料,好不容易完成了这个初步试验,先发表
这个简单的开发笔记,待以后更熟悉STM32CubeMx,HAL库和STM32L478后,再发一个比较全的开发笔记。
(一)STM32L476的低功耗模式总结:
  该器件具有以下几个低功耗模式:
    1. 睡眠模式(Sleep mode):CPU时钟关,所有的外设包括Cortex-M4核心外围设备象NVIC,SysTick,等能够唤
      醒CPU在中断或事件发生。
   
    2. 低功耗运行模式(Low-power run mode):这个模式是在当系统时钟频率为减少2兆赫以下时实现的。代码是
      从SRAM或闪存执行。稳压器是在低功耗模式,以尽量减少调节器的工作电流。
    3. 低功耗睡眠模式(Low-power sleep mode):这个模式从低功率运行模式进入:Cortex-M4是关闭的。
    4. STOP1和STOP2模式:SRAM1,SRAM2和所有寄存器内容被保留。所有在电压域VCORE的时钟停止,PLL,MSI,
      与HSI16和HSE是失能停止的。LSI和LSE可以保持运行。RTC可保持活跃。一些外围设备在停止模式检测唤醒
      条件。使用唤醒能力,可以使能HSI16 RC振荡器。
   在STOP2模式,大多数的电压域VCORE放在一个较低的泄漏模式。
      在STOP1模式,提供最大数量的活动外设和唤醒源,较小的唤醒时间但比STOP2功耗高。
      当从STOP1模式或STOP2模式退出时,系统时钟是MSI可到48MHz或使用HSI16,根据软件配置。
   5.待机模式(Standby mide):VCORE电压域断电。然而,它是可以保存SRAM2内容:
      –待机模式时 当寄存器PWR_CR3的RRS位是置"1"时,SRAM2保留内容,在这种情况下,SRAM2由低功耗
                     稳压器提供。
                     当寄存器PWR_CR3的RRS位清零时,在这种情况下,主电压稳压器和低功率稳压器被关断。
                     在VCORE电压域的所有时钟停止,PLL,MSI,HSI16和HSE被禁用。LSI和LSE可以保持运行。
                     RTC保持活跃。当退出待机模式时,系统时钟是MSI从1兆赫至8兆赫。
 6. 关机模式(Shutdown mode):VCORE电压域断电。在VCORE电压域所有的时钟停止,
                              
                                 PLL,MSI,HSI16,LSI和HSE被禁用。LSE保持运转。
                                 退出关机模式时,系统时钟是MSI在4兆赫。
                                 在这种模式下,电源电压监测被禁用。

  各低功耗模式之间的转换见下图:

                     

(二)实验内容及工程的建立:

1.本人主要想对低功耗运行模式和低功耗模式睡眠模式进行实验测试,根据各低功耗模式之间转换图,程序的方框图如下:

                  
                                       


       为了完成上面步骤,利用STLink的USB转串口功能,在程序中设计了USART2的响应,制定了一个简单的协议,
  协议命令为二字节,通过STLink的USB转发送到USART2,协议具体如下:
   发送 : 0x08 0x02由主模式进入低功耗运行模式。系统频率使用MSI,频率降为1MHz。
  
       发送 : 0x08 0x03由低功耗运行模式进入主模式。系统频率使用HSI16,配置为80MHz。
   在低功耗运行模式下 发送 : 0x08 0x08 由低功耗运行模式进入低功耗睡眠模式。

   UART2命令响应代码如下:

void U2_cmd(void)
{
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET)
if(HAL_UART_Receive(&huart2,U2_Rxbuf,2,100)==HAL_OK)
   {

   if((U2_Rxbuf==0x08)&&(U2_Rxbuf==0x01))//====主模式
      {
      SysTick->CTRL|= SysTick_CTRL_ENABLE_Msk;
   
   MX_USART2_UART_Init();
      U2_buf=0x09;U2_buf=0x01;
       HAL_UART_Transmit(&huart2,U2_buf,2,100);
   }
   if((U2_Rxbuf==0x08)&&(U2_Rxbuf==0x02))//====进入低功耗运行模式
      {
       //进入低功率运行模式,进行如下几步:
         //降低系统时钟频率低于2兆赫。
         //通过设置在PWR_CR1寄存器的LPR位,强迫调节器在低功耗模式。   
   SystemClock1M();
   MX_USART2_UART_Init();
   SET_BIT(PWR->CR1, PWR_CR1_LPR);
   
      U2_buf=0x0A;U2_buf=0x02;
       HAL_UART_Transmit(&huart2,U2_buf,2,100);
   }
   if((U2_Rxbuf==0x08)&&(U2_Rxbuf==0x03))//====退出低功耗运行模式进入主模式
      {
         //退出低功耗运行模式,进行如下几步:
         //通过清除在PWR_CR1寄存器的LPR位,强迫调节器在主运行模式。
         //等待直到PWR_SR2寄存器的REGLPF清零。
         //提高系统时钟频率,恢复主运行模式的时钟频率。
   CLEAR_BIT(PWR->CR1, PWR_CR1_LPR);
   while(HAL_IS_BIT_SET(PWR->SR2,PWR_SR2_REGLPF));   //HAL_IS_BIT_CLR(REG, BIT);
   SystemClock80M();
   MX_USART2_UART_Init();
   
   
      U2_buf=0x0B;U2_buf=0x03;
       HAL_UART_Transmit(&huart2,U2_buf,2,100);
   }
   if((U2_Rxbuf==0x08)&&(U2_Rxbuf==0x08)) //====进入睡眠模式
      {
   SysTick->CTRL&= ~SysTick_CTRL_ENABLE_Msk; //禁止系统中断
   HAL_NVIC_DisableIRQ(LPTIM1_IRQn);
   HAL_NVIC_DisableIRQ(TIM1_UP_TIM16_IRQn);//禁止TIM1中断   
   
   HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);   
         
      U2_buf=0x0D;U2_buf=0x08;
       HAL_UART_Transmit(&huart2,U2_buf,2,100);
   }
   }
}

      
2.工程的建立:

   工程在STM32CubeMx中建立配置了一个LPTIM1,一个TIM1, 三个UART分别为:LPUART1,UART2,UART4见下图:

      


       时种配置见下图:

      

      
   引脚配置见下图:
      

整个工程文件见附件:
   


(三)实验测试结果:  

  为了在实验结果中对低功耗运行有一个数字概念,将STM32L476RG-NUCLEO开发板的JP6跳线拆除,接一个万用表,
  在电流挡测试电流消耗。
  测试的结果为:在主普通模式下(系统频率80MHz)的电流消耗为 : 13.84mA

                            在低功耗运行模式(系统频率降为1MHz)的电流消耗为 : 0.85mA

                            在低功耗睡眠模式下的电流消耗为 : 0.78mA


主普通模式下的电流消耗为 : 13.84mA

   






低功耗运行模式的电流消耗为 : 0.85mA


   

低功耗睡眠模式下的电流消耗为 : 0.78mA



   




搜索

JackieLaura 发表于 2015-12-4 11:11:36

貌似这个万用表的精度不够吧

huaiqiao 发表于 2015-12-4 13:27:42

那个模块图画的很好。就是“各低功耗模式之间的转换”,用什么软件画的?

wm20031015 发表于 2015-12-4 15:12:54

换个微安档的表测,这数据不大对

Brady 发表于 2015-12-4 16:42:47

跟手册上的数据对比如何?

沐紫 发表于 2015-12-4 17:32:43

谢谢楼主

moyanming2013 发表于 2015-12-4 18:08:08

学习了。。。

yanhaijian 发表于 2015-12-5 11:55:19

再接再厉。

青蓝冰水 发表于 2017-4-9 11:55:09

:hug::hug:很好地帖子

DemonA 发表于 2018-1-3 18:23:12

楼主,这个功耗还是很大呀

watersui 发表于 2018-3-1 09:50:50

附件下载参考参考

wolfgang 发表于 2018-3-1 10:10:36

数据没对,看看软件设置。

小小个子 发表于 2018-4-2 14:27:16

学习了,谢谢楼主

小马哥 发表于 2018-11-17 22:01:31

小哥,感觉你写的很不错能否给我也写一片。

qianqufei 发表于 2019-10-20 15:37:46

谢谢楼主,很好的贴子:)
页: [1]
查看完整版本: 【NUCLEO-L476RG开发】STM32L476低功耗模式初试