第二十六天-待机唤醒实验
一、待机唤醒概念
二、低功耗模式
三、待机模式
四、相关寄存器和库函数
1、寄存器
2、库函数
五、待机唤醒实验
1、实验要求
2、实验详细代码
1、wkup.c
#include "wkup.h"
#include "key.h"
#include "delay.h"void WKUP_Init()
{//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitTypeDefStruct;GPIO_InitTypeDefStruct.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitTypeDefStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitTypeDefStruct.GPIO_Speed = GPIO_Speed_50MHz;//初始化GPIOA0 下拉输入GPIO_Init(GPIOA,&GPIO_InitTypeDefStruct);//设置GPIOA0 外中断GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_Pin_0);//设置外中断EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line0;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStruct);//设置外中断NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStruct);//判断是否长按 A0 3sif(isKey() == 0)EnterSTAND();}
//判断是否连按3s
u8 isKey()
{u8 t = 0;while(1){if(IN3 == SET){t++;delay_ms(30);if(t == 100)return 1;}elsereturn 0;}
}void EnterSTAND()
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);PWR_WakeUpPinCmd(ENABLE);PWR_EnterSTANDBYMode();
}void EXTI0_IRQHandler()
{EXTI_ClearITPendingBit(EXTI_Line0);if(isKey()){EnterSTAND();}
}
2、main.c
int main(void){ delay_init();uart_init(115200);LED_Init();printf("已经解除\r\n");NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);WKUP_Init();RTC_Init();LCD_Init(); LCD_ShowString(60,50,200,24,24,"HELLO WORLD!");LCD_ShowString(60,120,200,24,24," - - ");LCD_ShowString(60,174,200,24,24," : : ");while(1){LED0 =! LED0;delay_ms(1000);}}
3、代码逻辑
待机状态->按下键,解除待机->从main开始重新执行,所有寄存器全部复位,需重新初始化>若按键长达3s,则不会再次进入待机状态,进入正常状态,此时lcd亮;
正常状态->按下键,触发外部中断->若按键长达3s->计入待机状态,lcd屏幕熄灭
4、关键问题
①当在待机状态按下wake按键时,待机状态解除。此时是否会触发外部中断,从而影响程序正常执行?
不会的。因为,我们按键的开始时间点是从main重新开始执行的那个时候。当重新初始化中断,并使能后,此时信号只是处于高电平,而中断的触发条件是上升沿,因此中断不会被触发。