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);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使用外部中断方式
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
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寄存器
A1:->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 这里是重点!!!!!!!!!
A2:if(Check_WKUP()==0) Sys_Standby(); //不是开机,进入待机模式
}
中断服务
void EXTI0_IRQHandler(void)
{
EXTI->  R=1<<0; //清除LINE10上的中断标志位
if(Check_WKUP())//关机?
{
Sys_Enter_Standby(); //进入待机模
}
}
实验一开始就进入到待机模式 这个可以理解
但是后面唤醒功能的理解不能确定是不是正确的!!!!麻烦原子哥确认一下
1:按下唤醒键->程序从头开始跑,跑到配置完外部NVIC中断,这里不会进入中断,因为按键是上升沿触发,而按键一开是复位的时候就是高电平了,然后按超过3S
A2:if(Check_WKUP()==0) Sys_Standby(); 返回为1,条件不成立不进入待机模式 程序正常运行。
2:程序正常跑的时候,按键按下上升沿触发进入中断超过3s 执行Sys_Enter_Standby(); //进入待机模 。
疑问:唤醒,是不是因为唤醒键高电平不进入中断?
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //这里函数的意思为强制或者释放时钟 不知道有什么用 时钟不复位吗?还有0X01FC是不是为电源时钟那里看?没有这句话程序也正常跑
|