OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4060|回复: 6

stm32f407-外部中断响应问题

[复制链接]

2

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-11-10
在线时间
3 小时
发表于 2021-11-29 22:51:45 | 显示全部楼层 |阅读模式
2金钱
最近遇到了一点问题,长久都未得到解决,特来论坛求教,希望各位老师不吝赐教,谢谢。
程序初始化运行后符合理想,但是我的外部中断触发后并没有出现我理想的中断现象,程序初始化运行红灯长灭1.5秒,然后亮1.5秒,之后蜂鸣器响两下同时红灯闪两下,就这样一直循环。我理想的结果就是当我触发中断时红灯灭,蜂鸣器不响,绿灯亮起来。现实的情况是当触发中断时,如果我在红灯长亮的1.5秒内触发中断结果就是红灯长亮,蜂鸣器长响;如果我在红灯闪烁或者长暗1.5秒内的期间触发中断结果就是红灯灭,蜂鸣器不响了。反复研究了好几遍,实在想不出来问题出现在了哪里,迫不得已来论坛请教老师们了,希望老师们可以指点一下在下,main.c和exti.c如下所示,其中我尽可能做了我所理解的注释来帮助老师们看我的程序,可能会出现差错,希望老师们多多包涵。
#include "sys.h"
#include "led.h"
#include "button.h"
#include "beep.h"
#include "exti.h"
#include "systick.h"

int main (void)
{
    LED_Init();
    BEEP_Init();
    Systick_Init();//延时用的
    EXTIX_Init();//初始化
   
    while(1)
    {
        GPIO_SetBits(GPIOF,GPIO_Pin_9);
        GPIO_ResetBits(GPIOF,GPIO_Pin_8);//蜂鸣器不响
        Delay_ms(1500);              //灭一秒
        GPIO_ResetBits(GPIOF,GPIO_Pin_9);
        GPIO_SetBits(GPIOF,GPIO_Pin_8);//蜂鸣器响
        Delay_ms(1500);              //亮一秒
        
        GPIO_SetBits(GPIOF,GPIO_Pin_9);
        GPIO_ResetBits(GPIOF,GPIO_Pin_8);//蜂鸣器不响
        Delay_ms(100);                 //突然暗下来
        GPIO_ResetBits(GPIOF,GPIO_Pin_9);
        GPIO_SetBits(GPIOF,GPIO_Pin_8);//蜂鸣器响
        Delay_ms(300);                  //闪亮一下
        GPIO_SetBits(GPIOF,GPIO_Pin_9);
        GPIO_ResetBits(GPIOF,GPIO_Pin_8);//蜂鸣器不响
        Delay_ms(100);                  //再暗下来
        GPIO_ResetBits(GPIOF,GPIO_Pin_9);
        GPIO_SetBits(GPIOF,GPIO_Pin_8);//蜂鸣器响
        Delay_ms(300);                  //再闪亮一下
        
    }
}


#include "exti.h"
#include "button.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "misc.h"
#include "systick.h"


void EXTI4_IROHandler(void)//外部中断4
{
   
    Delay_ms(10); //消抖
    if (BUTTON0==0)
    {
        GPIO_SetBits(GPIOF,GPIO_Pin_9);//红灯灭
        GPIO_ResetBits(GPIOF,GPIO_Pin_8);//蜂鸣器灭
        GPIO_ResetBits(GPIOF,GPIO_Pin_10);//绿灯亮
    }
        EXTI_ClearITPendingBit(EXTI_Line4);//清空挂起标志位
}
void EXTIX_Init(void)
{
    //定义EXTI和NVIC结构体
    NVIC_InitTypeDef NVIC_InitInstructure;
    EXTI_InitTypeDef EXTI_InitInstructure;
   
    BUTTON_Init();//因为下面用到IO口了,所以要在这里进行初始化
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//使用GPIO外部中断必须使能SYSCFG时钟
   
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,GPIO_PinSource4);//IO引脚和EXTI相映射,PE4连接到中断线4
                                                                //PE4-->EXTI_Line4-->NVIC_IRQChannel=EXTI4_IRQn
   
    //配置外部中断EXIT
    EXTI_InitInstructure.EXTI_Line=EXTI_Line4;//选择外部中断线4(中断源),应与后面的NVIC相对应
    EXTI_InitInstructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置EXIT线路模式为中断模式(EXTI_Mode_Event这个是事件模式)
    EXTI_InitInstructure.EXTI_Trigger=EXTI_Trigger_Falling;//设置外部中断出发方式为下降沿触发
    EXTI_InitInstructure.EXTI_LineCmd=ENABLE; //使能外部中断线路
    EXTI_Init(&EXTI_InitInstructure);
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//使用优先级分组2,抢占优先级和相应优先级都占两位
   
    NVIC_InitInstructure.NVIC_IRQChannel=EXTI4_IRQn;//配置中断源IRO通道
                                                    //配置NVIC和EXTI相映射
    NVIC_InitInstructure.NVIC_IRQChannelPreemptionPriority=0;//配置抢占优先级为0
    NVIC_InitInstructure.NVIC_IRQChannelSubPriority=1;//配置响应优先级为1
    NVIC_InitInstructure.NVIC_IRQChannelCmd=ENABLE;//使能中断通道
    NVIC_Init(&NVIC_InitInstructure);   
}





最佳答案

查看完整内容[请看2#楼]

逻辑不对,会发生意想不到的结果。主函数while()一直在循环执行led和蜂鸣器的驱动,当外部中断触发后也会执行这个操作,这不会冲突吗?应该在主函数中再添加标志位,在没有外部中断触发时只执行主函数的操作,有中断触发只执行中断服务函数里面的操作。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2019-9-5
在线时间
68 小时
发表于 2021-11-29 22:51:46 | 显示全部楼层
逻辑不对,会发生意想不到的结果。主函数while()一直在循环执行led和蜂鸣器的驱动,当外部中断触发后也会执行这个操作,这不会冲突吗?应该在主函数中再添加标志位,在没有外部中断触发时只执行主函数的操作,有中断触发只执行中断服务函数里面的操作。
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1734
金钱
1734
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-11-30 09:57:38 | 显示全部楼层
看不出来,硬件仿真一下
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-11-10
在线时间
3 小时
 楼主| 发表于 2021-11-30 11:08:36 | 显示全部楼层
huanan 发表于 2021-11-30 09:57
看不出来,硬件仿真一下

请问是需要用proteus做硬件仿真吗?
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1734
金钱
1734
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-11-30 11:28:11 | 显示全部楼层
7188616 发表于 2021-11-30 11:08
请问是需要用proteus做硬件仿真吗?

仿真器仿真
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-11-10
在线时间
3 小时
 楼主| 发表于 2021-11-30 14:49:04 | 显示全部楼层

在板子上跑过了,出现的结果就是上述我所叙述的现象,不知道您说的是不是这个?
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-11-10
在线时间
3 小时
 楼主| 发表于 2021-12-17 12:05:24 | 显示全部楼层
Stefen 发表于 2021-12-3 17:49
逻辑不对,会发生意想不到的结果。主函数while()一直在循环执行led和蜂鸣器的驱动,当外部中断触发后也会执 ...

哦哦,非常感谢!问题已解决!感谢感谢!!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 15:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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