中级会员
 
- 积分
- 250
- 金钱
- 250
- 注册时间
- 2020-3-3
- 在线时间
- 85 小时
|
这是按键的初始化
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//配置B端口 B3-6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
//u8 key0_count=0;
//u8 key1_count=0;
//u8 wk_count=0;
u8 key_scan(u8 mode)
{
static u8 key_up=1; //按键按&松开标志
if(mode) key_up=1;
if(key_up&&(KEY0==0|KEY1==0&&KEY2==0&&KEY3==0))
{
delay_ms(10); //按键去抖动,消抖
key_up=0; //按键已松开,去判断是哪个按键按下
if(KEY0==0) return 1;
else if(KEY1==0) return 2;
else if(KEY2==0) return 3;
else if(KEY3==0) return 4;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1) key_up=1;
return 0;
}
中断配置以及中断函数
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
KEY_Init();//初始化按键对应io模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//GPIOB.3 中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键0所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
//GPIOB.4 中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按键1所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
//GPIOB.5 中断线以及中断初始化配置 按键2的中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line=EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0X02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0X02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//GPIOB.6
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);
EXTI_InitStructure.EXTI_Line=EXTI_Line6;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI3_IRQHandler(void)
{
delay_ms(100); // 延时消抖
if(EXTI_GetFlagStatus(EXTI_Line3)!=RESET)
{
if(key_scan(0)==1) //不支持连按模式
{
//按键key0按一次pwm占空比增加
if(ccr<3599)
{
ccr+=90;
}
else ccr=0;
}
EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE0上的中断标志位
}
//TIM_SetCompare1(TIM3,ccr);
//TIM_SetCompare2(TIM3,ccr);
//TIM_SetCompare3(TIM3,ccr);
//TIM_SetCompare4(TIM3,ccr);
//rintf("按键0在产生中断,pwm占空比增大");
}
void EXTI4_IRQHandler(void)
{
delay_ms(30); //消抖
if(EXTI_GetFlagStatus(EXTI_Line4)!=RESET)
{
if(key_scan(0)==2) //不支持连按模式
{
if(ccr>90) //key1 pwm占空比减小
{
ccr-=90;
}
else ccr=3599;
}
EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE1线路挂起位
}
//TIM_SetCompare1(TIM3,ccr);
//TIM_SetCompare2(TIM3,ccr);
//TIM_SetCompare3(TIM3,ccr);
//TIM_SetCompare4(TIM3,ccr);
}
void EXTI9_5_IRQHandler(void)
{
delay_ms(50); //消抖
if(EXTI_GetFlagStatus(EXTI_Line5)!=RESET)
{
if(key_scan(0)==3) //不支持连按模式
{
reload=TIM3->ARR; //频率增大
if(reload>90)
{
reload-=90;
}
else reload=3599;
}
EXTI_ClearITPendingBit(EXTI_Line5);
}
TIM_SetAutoreload(TIM3,reload);
//TIM_SetCompare1(TIM3,ccr1);
//TIM_SetCompare2(TIM3,ccr2);
//TIM_SetCompare3(TIM3,ccr3); //设置固定占空比
//TIM_SetCompare4(TIM3,ccr4);
//printf(按键2在产生中断,频率在增大");
}
void EXTI9_5_IRQHandeler(void)
{
delay_ms(50);
if(EXTI_GetFlagStatus(EXTI_Line6)!=RESET)
{
if(key_scan(0)==4) //频率减小
{
reload=TIM3->ARR;
if(reload<3599)
{
reload+=90; //超过TIM3->ARR的值,就变为0
}
else reload=0;
}
EXTI_ClearITPendingBit(EXTI_Line6);
}
TIM_SetAutoreload(TIM3,reload);
//TIM_SetCompare1(TIM3,ccr1);
//TIM_SetCompare2(TIM3,ccr2); //固定的占空比
//TIM_SetCompare3(TIM3,ccr3);
//TIM_SetCompare4(TIM3,ccr3);
}
|
|