初级会员

- 积分
- 120
- 金钱
- 120
- 注册时间
- 2016-9-20
- 在线时间
- 26 小时
|
10金钱
这几天看了论坛上的好多帖子,基本搞懂了原子的待机唤醒程序,我想在待机唤醒程序的基础上增加一个功能,比如说开机之后10分钟内没有操作,就自动再次进入待机状态。我考虑的是再加一个定时器中断,不知道思路对不对。下面开始贴程序:
void WKUP_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI0_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;//下拉输入=上升沿触发;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//十分重要的一句!!
EXTI0_InitStruct.EXTI_Line=EXTI_Line0;
EXTI0_InitStruct.EXTI_LineCmd=ENABLE;
EXTI0_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI0_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发中断
EXTI_Init(&EXTI0_InitStruct);
//设置中断优先级
NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStruct);
if(WKUP_Scan()==0)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_EnterSTANDBYMode();//一开始是待机模式
}
}
u8 WKUP_Scan()
{
u8 t;
LED0=0;
while(1)
{
if(WKUP_Status==1)
{
t++;
delay_ms(30);
if(t>=100)
{
LED0=0;//开机灯亮起
return 1;
}
}
else
{
LED0=1;
return 0;//没有按键按下,进入待机模式调到wkup_Init这个函数里面去了
}
}
}
//进入待机模式
void Enter_Standby()
{
RCC_APB2PeriphResetCmd(0x01fc,DISABLE);//在进入待机模式前先对所有的IO口进行复位操作(RCC_APB2RST寄存器)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR的时钟(关机开机都涉及到pwr)
PWR_WakeUpPinCmd(ENABLE);//使能PWR的引脚唤醒功能
PWR_EnterSTANDBYMode();
}
//EXTI0中断函数
void EXTI0_IRQHandler()
{
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位
if(WKUP_Scan()==1)
Enter_Standby();//(第二次按下按键之后的中断使得进入待机模式)
}
void WKUP_TIM_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定时器初始化设置
NVIC_InitTypeDef NVIC_InitStruct;//定时器中断优先级设置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period=arr;
TIM_TimeBaseStruct.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStruct);
}
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//检查中断是否发生
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//发生了中断,先将中断标志位清零
LED0=1;
Enter_Standby();//进入待机模式
}
}
|
|