新手上路
积分 32
金钱 32
注册时间 2019-7-18
在线时间 7 小时
1 金钱
WKUP_KD 是PA0
void Sys_Standby(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式
}
//系统进入待机模式
void Sys_Enter_Standby(void)
{
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口
Sys_Standby();
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
// 0:错误的触发
u8 Check_WKUP(void)
{
u8 t=0; //记录按下的时间
LED0=0; //亮灯DS0
while(1)
{
if(WKUP_KD)
{
t++; //已经按下了
delay_ms(30);
if(t>=1) //按下超过3秒钟
{
LED0=0; //点亮DS0
return 1; //按下3s以上了
}
}else
{
return 0; //按下不足3秒
}
}
}
//中断,检测到PA0脚的一个上升沿.
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{
if(Check_WKUP())//关机?
{
Sys_Enter_Standby();
}
}
//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{
GPIO_InitTypeDef GPIO_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
//使用外部中断方式
}
‘主函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "remote.h"
#include "timer.h"
#include "wkup.h"
int main(void)
{
u16 led0pwmval=0;
u16 asd;
u8 dir=1;
u8 key;
u8 t=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init();
WKUP_Init();
KEY_Init();
Remote_Init(); //红外接收初始化
while(1)
{
key=Remote_Scan();
if(key)
{
switch(key)
{
case 104: TIM3_PWM_Init(899,0);asd=100;break;
case 152:TIM3_PWM_Init(899,0);asd=500;break;
case 176:WKUP_KD=!WKUP_KD;break;
case 48:;break;
case 24:;break;
case 122:;break;
case 16:;break;
case 56:;break;
case 90:;break;
case 66:;break;
case 82:;break;
}
}else delay_ms(10);
t++;
if(t==20)
{
t=0;
}
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>asd)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
IN2=0;
}
}
我来回答