//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(); //不是开机,进入待机模式 }
/* *@功能:唤醒初始化 */ void WKUP_Init(void) { uint8_t cw; cw=Check_WKUP(); OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示 //程序刚下进去时由于没有长按取消键,所以检测结果为0,直接进入停机模式 //if(Check_WKUP()) if(!cw) Sys_Standby(); //不是开机,进入停机模式 }
//PA0 WKUP唤醒初始化 void WKUP_Init(void) { RCC->APB2ENR|=1<<2; //先使能外设IO PORTA时钟 RCC->APB2ENR|=1<<0; //开启辅助时钟 GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入 GPIOA->CRL|=0X00000008; Ex_NVIC_Config(GPIO_A,0,RTIR);//PA0上升沿触发 //(检查是否是正常开)机 if(Check_WKUP()==0)Sys_Standby(); //不是开机,进入待机模式 MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2 }
/* *@功能:系统进入停机模式 */ void Sys_Enter_Standby(void) { //相比Sys_Standby(),在进入停机模式之前,可以做些减小功耗的措施 //这里做一些可以在停机模式减小功耗的措施 OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示 //RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口 Sys_Standby(); }
//系统进入待机模式 void Sys_Enter_Standby(void) { //关闭所有外设(根据实际情况写) RCC->APB2RSTR|=0X01FC;//复位所有IO口 Sys_Standby();//进入待机模式 }
//系统进入待机模式 void Sys_Enter_Standby(void) { RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口 Sys_Standby(); }