ffice ffice" />
调试中问题有:(1)if((key_up)&&(GetState_KEY(KEY1)==0)) //这里仿佛(GetState_KEY(KEY1)==0)永久成立一样~~
所以我想问下大家在mdk调试中怎么查看寄存器的值呢?比如GPIOC->IDR
(2)按键很不稳定,有时候按2号键,它可能进入3号的中断;而其特容易触发,我感觉还没碰着按键他就跳进中断了,就跟热感应一样
大家帮忙看看啊~~
//输入宏定义
#define GetState_KEY(key_num) GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0<<(key_num)) //返回按键所端口电平状态
void EXTI0_IRQHandler(void)
{
Key_Value =0;
//判断中断管脚
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// if((key_up)&&(GPIOC->IDR & ((uint16_t)0x0001)!=0)) //按键1
if((key_up)&&(GetState_KEY(KEY1)==0)) //这里仿佛(GetState_KEY(KEY1)==0)永久成立一样~~ 调试到这里我松开按键,但他还是继续往下执行~~
{
key_up=0;
MyDelay_nms(50); //消抖
if(GetState_KEY(KEY1)==0) //还是继续往下执行~~
{
Key_Value =1; //1号键
}
}
/* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingBit(EXTI_Line0);
}
key_up=1;
}
void EXTI1_IRQHandler(void)
{
Key_Value =0;
//判断中断管脚
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{
if((key_up)&&(GetState_KEY(KEY2)==0))
{
key_up=0;
MyDelay_nms(50);
if(GetState_KEY(KEY2)==0)
{
Key_Value =2;
}
}
// }
/* Clear the EXTI line 1 pending bit */
EXTI_ClearITPendingBit(EXTI_Line1);
}
key_up=1;
}
void EXTI2_IRQHandler(void)
{
Key_Value =0;
//判断中断管脚
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
{
if((key_up)&&(GetState_KEY(KEY3)==0))
{
key_up=0;
MyDelay_nms(50);
if(GetState_KEY(KEY3)==0)
{
Key_Value =3;
}
}
// }
/* Clear the EXTI line 2 pending bit */
EXTI_ClearITPendingBit(EXTI_Line2);
}
key_up=1;
}
void EXTI3_IRQHandler(void)
{
Key_Value =0;
//判断中断管脚
if(EXTI_GetITStatus(EXTI_Line3) != RESET)
{
if((key_up)&&(GetState_KEY(KEY4)==0))
{
key_up=0;
MyDelay_nms(50);
if(GetState_KEY(KEY4)==0)
{
Key_Value =4;
}
}
// }
/* Clear the EXTI line 3 pending bit */
EXTI_ClearITPendingBit(EXTI_Line3);
}
key_up=1;
}
以下是四个中断的优先级/* Enable the EXTI Interrupt */
//外部中断使用的NVIC配置
// /* Configure one bit for preemption priority */
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the EXTI Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the EXTI Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the EXTI Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
|