新手入门
- 积分
- 12
- 金钱
- 12
- 注册时间
- 2021-11-10
- 在线时间
- 3 小时
|
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和蜂鸣器的驱动,当外部中断触发后也会执行这个操作,这不会冲突吗?应该在主函数中再添加标志位,在没有外部中断触发时只执行主函数的操作,有中断触发只执行中断服务函数里面的操作。
|