发新帖本帖赏金 3.00元(功能说明)我要提问
返回列表
打印
[STM32L4]

stm32l4+低功耗模式分享

[复制链接]
6307|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 junpeng324 于 2017-11-16 23:14 编辑

Stm32l4 支持7种低功耗

睡眠模式:

CPU停止工作,所有外设仍可以工作,使用中断(interrupt)或者事件(event)进行CPU唤醒。

低功耗运行模式(Low-power run):

使用最低电压进行提供内核电压(VCORE),代码可以在SRAM和FLASH里面进行运行,CPU运行频率限制在2MHz,外设(peripheral)使用独立的16MHz时钟。

低功耗睡眠模式(Low-power sleep):

只有CPU时钟被停止,当中断(interrupt)或者事件(event)唤醒CPU之后进入低功耗运行模式(Low-powerrun)。

停止0(Stop 0)、停止1(Stop1)、停止2(Stop 2)模式:

停止模式下将会获取一个最低的功耗用来保持SRAM和寄存器的内容。内核电压(VCORE)控制的始终将停止,PLL、MSI RC、HIS16 RC 和 HSE都停止。LSE和LSI仍保持运行。RTC保持运行状态。

待机模式(Standby):

待机模式下将会使用BOR(brown-outreset)获取一个最低的功耗。内核电压(VCORE)控制的始终将停止,PLL、MSI RC、HIS16 RC、HSE、LSE和LSI都停止。RTC保持运行状态。进入待机模式后SRAM1和集训期内容将会丢失,SRAM2的内容将保留。设备退出待机模式可以利用外部复位(NRST pin)、独立看门狗(IWDG)、唤醒引脚事件(WKUP pin event)或者RTC事件(alarm, periodic wakeup, timestamp, tamper)。唤醒之后时钟切换到8MHz的MSI。

关断模式(Shutdown):

关断模式下会获取一个最低的功耗,内核电压(VCORE)控制的始终将停止,PLL、MSI RC、HIS16 RC、HSE、LSE和LSI都停止。RTC保持运行状态。BOR(brown-out reset)不能使用。SRAM1、SRAM2和寄存器除了备份都会丢失。设备退出关断模式可以利用外部复位(NRST pin)、唤醒引脚事件(WKUP pin event)或者RTC事件(alarm, periodic wakeup, timestamp, tamper)。唤醒之后时钟切换到4MHz的MSI。


低功耗实例代码:



//系统进入待机模式
void Sys_Enter_Standby(void)
{               
  while(WKUP_KD);                        //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)

        RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟                 
         
        PWR_BackupAccessCmd(ENABLE);//后备区域访问使能


        //这里我们就直接关闭相关RTC中断
        RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。
        RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。
       
        PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
       
        PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒
       
        PWR_EnterSTANDBYMode();        //进入待机模式
         
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发       
u8 Check_WKUP(void)
{
        u8 t=0;
        u8 tx=0;//记录松开的次数
        LED0=0; //亮灯DS0
        while(1)
        {
                if(WKUP_KD)//已经按下了
                {
                        t++;
                        tx=0;
                }else
                {
                        tx++;
                        if(tx>3)//超过90ms内没有WKUP信号
                        {
                                LED0=1;
                                return 0;//错误的按键,按下次数不够
                        }
                }
                delay_ms(30);
                if(t>=100)//按下超过3秒钟
                {
                        LED0=0;          //点亮DS0
                        return 1; //按下3s以上了
                }
        }
}  
//中断,检测到PA0脚的一个上升沿.          
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{                                                                                                  
  EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位
        if(Check_WKUP())//关机?
        {                  
                Sys_Enter_Standby(); //进入待机模式
        }
}


//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{          
  GPIO_InitTypeDef  GPIO_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
        EXTI_InitTypeDef   EXTI_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化       


        //(检查是否是正常开)机                     
  if(Check_WKUP()==0)
        {
                Sys_Enter_Standby();        //不是开机,进入待机模式  
        }
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0
       

  EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
  EXTI_Init(&EXTI_InitStructure);//配置
       
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置NVIC
       

}




打赏榜单

21ic小管家 打赏了 3.00 元 2017-12-07

沙发
junpeng324|  楼主 | 2017-11-16 23:04 | 只看该作者
STM32L452开发板,超低功耗模式测试。

9.jpg (283.35 KB )

9.jpg

使用特权

评论回复
板凳
junpeng324|  楼主 | 2017-11-16 23:05 | 只看该作者
精美的ST的封面,来之STM32L4的手册。

1.jpg (220.78 KB )

1.jpg

使用特权

评论回复
地板
junpeng324|  楼主 | 2017-11-16 23:07 | 只看该作者
关于低功耗手册的一些图像介绍

2.jpg (302.91 KB )

2.jpg

3.jpg (389.3 KB )

3.jpg

4.jpg (290.71 KB )

4.jpg

5.jpg (331.87 KB )

5.jpg

使用特权

评论回复
5
junpeng324|  楼主 | 2017-11-16 23:09 | 只看该作者
不错,L4主要是功耗低我们用的特别多。

使用特权

评论回复
6
一路向北lm| | 2017-11-17 11:56 | 只看该作者
资料不错,赞一个,低功耗太重要了。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

1130

帖子

8

粉丝