STM32系列第17篇--待机唤醒
扫描二维码
随时随地手机看文章
STM32的3种低功耗模式:
睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。
待机模式: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"voidSys_Standby(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能电源时钟PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚功能PWR_EnterSTANDBYMode();//进入待命(STANDBY)模式}//系统进入待机模式voidSys_Enter_Standby(void){RCC_APB2PeriphResetCmd(0X01FC,DISABLE);//复位所有IO口Sys_Standby();}//检测WKUP脚的信号//返回值1:连续按下3s以上//0:错误的触发u8Check_WKUP(void){u8t=0;//记录按下的时间LED0=0;//亮灯LED0while(1){if(WKUP_KD){t++;//已经按下了delay_ms(30);if(t>=100)//按下超过3秒钟{LED0=0;//点亮DS0return1;//按下3s以上了}}else{LED0=1;return0;//按下不足3秒}}}//中断,检测到PA0脚的一个上升沿.//中断线0线上的中断检测voidEXTI0_IRQHandler(void){EXTI_ClearITPendingBit(EXTI_Line0);//清除LINE10上的中断标志位if(Check_WKUP())//关机?{Sys_Enter_Standby();}}//PA0WKUP唤醒初始化voidWKUP_Init(void){GPIO_InitTypeDefGPIO_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能GPIOA和复用功能时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PA.0GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//上拉输入GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO//使用外部中断方式GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//中断线0连接GPIOA.0EXTI_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();//没有按三秒,不是开机,进入待机模式}