新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2018-7-26
- 在线时间
- 11 小时
|
当前发现一个想不通的问题。
按键0、按键1,按键WK_UP的主优先级相同,副优先级不同分别是1,2,3。
每个按键的中断函数处理时长约10秒左右。按键中断函数可以从灯闪的不同效果看出。
当按键0中断处理约2秒后,按下按键1,过两秒后再按按键2。按键0的中断函数处理完毕,程序没有继续处理按键1和按键WK_UP的中断。
当重新设定中断分组,按键0、1、WK_UP,主优先级为1、2、3,副优先级相同。
先按下按键WK_UP,两秒后按下按键1 ,继续两秒后按下按键0,程序能形成嵌套。正常。
求指导。程序见附件。
#include "exti.h"
#include "bsp_key.h"
#include "bsp_led.h"
#include "delay.h"
u8 extern KEY_NUM;
//按键中断初始化函数
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
Key_Init( );
/*---------------------------配置KEY0------------------------------*/
/* 选择EXTI的信号源 */
GPIO_EXTILineConfig(KEY0_EXTI_PORTSOURCE, KEY0_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = KEY0_EXTI_LINE;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 下降沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*---------------------------配置KEY1------------------------------*/
/* 选择EXTI的信号源 */
GPIO_EXTILineConfig(KEY1_EXTI_PORTSOURCE, KEY1_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 下降沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*---------------------------配置WK_UP------------------------------*/
/* 选择EXTI的信号源 */
GPIO_EXTILineConfig(WK_UP_EXTI_PORTSOURCE, WK_UP_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = WK_UP_EXTI_LINE;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*---------------------------配置KEY0 优先级 高------------------------------*/
/* 配置NVIC为优先级组1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中断源:按键KEY0 */
NVIC_InitStructure.NVIC_IRQChannel = KEY0_EXTI_IRQ;
/* 配置抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*---------------------------配置KEY1 优先级 中------------------------------*/
/* 配置NVIC为优先级组1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中断源:按键KEY1,其他使用上面相关配置 */
NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQ;
/* 配置抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*---------------------------配置WK_UP 优先级 低------------------------------*/
/* 配置NVIC为优先级组1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中断源:按键WK_UP,其他使用上面相关配置 */
NVIC_InitStructure.NVIC_IRQChannel = WK_UP_EXTI_IRQ;
/* 配置抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
/* 配置子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//按键中断服务函数 优先级高中低 KEY0\ KEY1 \WK_UP
void KEY0_IRQHandler(void)
{
u8 i=20;
delay_ms(10); //消抖
if(KEY0==0)
{
while(i--)
{
delay_ms(200);
LED1=ON;LED0=OFF;
delay_ms(200);
LED1=OFF;LED0=ON;
}
LED1=OFF;LED0=OFF;
}
EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位
}
void KEY1_IRQHandler(void)
{ u32 i=30;
delay_ms(10); //消抖
if(KEY1==0)
{
while(i--)
{
LED1=ON;LED0=ON;delay_ms(400);
}
LED1=OFF;LED0=OFF;
}
EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位
}
void WK_UP_IRQHandler(void)
{
u8 i=10;
delay_ms(10); //消抖
if(WK_UP==1)
{
while(i--)
{
delay_ms(1000);
LED1=ON;LED0=ON;
delay_ms(1000);
LED1=OFF;LED0=OFF;
}
LED1=OFF;LED0=OFF;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位
}
|
|