×
单片机 > 单片机程序设计 > 详情

STM32的3种低功耗模式

发布时间:2020-05-30 发布时间:
|
  1. 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。

  2. 停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。

  3. 待机模式:1.8V内核电源关闭;只有备份寄存器和待机电路维持供电;寄存器和SRAM内容全部丢失;实现最低功耗。

STM32的3种低功耗唤醒方式:

STM32待机模式:

在待机模式下,所有的I/O引脚均处于高阻态,除了复位引脚、被使能的唤醒引脚和TAMPER引脚。待机模式下只有2uA的电流,停机模式下20uA的电流。 
库函数进入待机模式: 
1. 使能电源时钟。 
2. 设置WK_UP引脚作为唤醒源。 
3. 设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。 
程序源码:


#include "wkup.h"

#include "led.h"

#include "delay.h"

 

void Sys_Standby(void)

{  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能电源时钟

    PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

    PWR_EnterSTANDBYMode();    //进入待命(STANDBY)模式         

}

 

//系统进入待机模式

void Sys_Enter_Standby(void)

{            

    RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口

    Sys_Standby();

}

 

//检测WKUP脚的信号

//返回值1:连续按下3s以上

//     0:错误的触发  

u8 Check_WKUP(void) 

{

    u8 t=0; //记录按下的时间

    LED0=0; //亮灯LED0 

    while(1)

    {

        if(WKUP_KD)

        {

            t++;            //已经按下了 

            delay_ms(30);

            if(t>=100)      //按下超过3秒钟

            {

                LED0=0;     //点亮DS0 

                return 1;   //按下3s以上了

            }

        }else 

        { 

            LED0=1;

            return 0; //按下不足3秒

        }

    }

 

//中断,检测到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_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;     //PA.0

    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入

    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化IO

    //使用外部中断方式

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中断线0连接GPIOA.0

 

    EXTI_InitStructure.EXTI_Line = EXTI_Line0;  //设置按键所有的外部线路

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //设外外部中断模式:EXTI线路为中断请求

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure); // 初始化外部中断

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

    NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

    if(Check_WKUP()==0) Sys_Standby();    //没有按三秒,不是开机,进入待机模式  

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式