野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9799|回复: 4

普通delay函数与外部中断,请大神看下!!!

[复制链接]
发表于 2019-3-14 09:21:25 | 显示全部楼层 |阅读模式
遇到了一个问题,请各位大神看下。
主函数中,在while循环时,不论我按何时下按键中断,总是在循环显示(SendGroupData_TA6932该函数是去控制数码管显示)结束后,才进入外部中断函数,百思不得其解呀!!!
难道普通的delay函数比外部中断的优先级高吗????????
还请各位大神指导下

uint8_t   key1_int_flag = 0;//按键中断标志位

delay函数void Delay( uint32_t count)
{
        for(;count!=0;count--);
}

void   EXTI7_GPIOB7_Config(void);
void   key_steup_scan(void);//按键设置函数,按键按下后才进入此函数
void   SendGroupData_TA6932(unsigned char addr,unsigned char* arr,unsigned char len);//发送显示内容到TA6932
主函数大致如下:
main()
{
        EXTI7_GPIOB7_Config();
            while(1)
        {
                if(key1_int_flag == 1)
                {
                        key_steup_scan();
                }
                else
                {
                        SendGroupData_TA6932(0,TA6932_Data_Un,9);
                        Delay(0xFFFFFF);
                        SendGroupData_TA6932(0,TA6932_Data_An,9);
                        Delay(0xFFFFFF);
                        SendGroupData_TA6932(0,TA6932_Data_Tem,9);
                        Delay(0xFFFFFF);
                }
        }
}

//中断配置函数
void EXTI7_GPIOB7_Config(void)
{
        NVIC_InitTypeDef  NVIC_InitStruct;
        GPIO_InitTypeDef  GPIO_InitStruct;
        EXTI_InitTypeDef  EXTI_InitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        //EXTI9_5中断配置,按键1
        NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
       
        //配置按键引脚
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
        EXTI_InitStruct.EXTI_Line = EXTI_Line7;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);
}


//中断函数
void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetFlagStatus(EXTI_Line7)!=RESET)
        {
                if(key1_int_flag == 0)
                {
                        key1_int_flag = 1;
                }
                else
                {
                        key1_int_flag =0;
                }
                EXTI_ClearITPendingBit(EXTI_Line7);
        }
}

回复

使用道具 举报

发表于 2019-3-14 10:19:30 | 显示全部楼层
因为在key1_int_flag置1的时候,循环里可能已经进入到else分支了,要执行完才到下一次循环,然后对标志进行判断
回复 支持 反对

使用道具 举报

发表于 2019-3-14 10:24:46 | 显示全部楼层
因为你整个while函数里面占用时间最长的函数是延时函数啊,中断可以在任意时刻修改标志,但是你判断标志必然是在新的一轮函数的开头进行的吧,然后才会执行key_scan
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 11:31:44 | 显示全部楼层
子车梨祎 发表于 2019-3-14 10:19
因为在key1_int_flag置1的时候,循环里可能已经进入到else分支了,要执行完才到下一次循环,然后对标志进行 ...

额额额,刚反应过来,谢谢啦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 11:32:15 | 显示全部楼层
非谢家之宝树 发表于 2019-3-14 10:24
因为你整个while函数里面占用时间最长的函数是延时函数啊,中断可以在任意时刻修改标志,但是你判断标志必 ...

嗯嗯,没想到这一点,谢谢啦!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 07:30 , Processed in 0.088703 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表