外部io中断(配置),进不去中断?

2019-07-21 01:32发布

io中断配置的是PA1口,

服务子程序是void EXTI1_IRQHandler(void),
接入PA1的信号是:脉冲(平时为1,会有下降沿&上升沿)

进不去中断??


1.以下是IO中断配置函数

[mw_shl_code=c,true]#include "IO_Digital.h" #include "sys.h" // //0.设置外部中断源和优先级 //可能要改名字? void NVIC_Config_IO(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组 /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // //1、打开PA时钟,设置PA0引脚为输入。 void EXTI_GPIO_Congig(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //PA RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); //SYSCFG 2.打开系统配置控制器时钟。 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //按键实验是上拉输入 //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); //最后把gpio初始化结构体的参数写入寄存器中 } // //3、配置外部中断EXTI的工作方式. // 映射到PA0,即线0,使用中断模式下降沿触发。 // 设置EXTI寄存器的工作方式交给了库函数。 void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; EXTI_GPIO_Congig(); //也是自己写的 //因为要用的IO口做中断源,故IO的复用功能必须使能. //GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0); //这是以前的F103所用的配置函数 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1); //407使用的配置函数 EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿,中断模式下降沿触发 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_Init(&EXTI_InitStructure); } // //4、编写中断处理函数,实现向串口打印信息。 // 固定的函数名:void EXTI1_IRQHandler(void)。 // 进入中断处理函数后,首先检查是否为线0的中断。如果是,则清除这个中断标志。之后就可以发送消息了。 // 消息发送完成之后,清除在处理外部中断期间到来的外部中断。使用EXTI_ClearITPendingBit()完成 int IO_Digital_Flag; //加入响应函数 void EXTI1_IRQHandler(void) { if(SET == EXTI_GetITStatus(EXTI_Line1)) //此处可以判断是哪个中断line,因为不同中断线可能对应相同的中断向量 { //如else if(EXTI_GetITStatus(EXTI_Line11 )!= RESET) // EXTI_ClearFlag(EXTI_Line1); //SET=1;(在IO处设置)只有下降沿才能进入中断 // printf("i am in exti irqhandler "); IO_Digital_Flag = 1; EXTI_ClearITPendingBit(EXTI_Line1); } } [/mw_shl_code]

2.以下是main函数中的初始化

[mw_shl_code=c,true]#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "IO_Digital.h" extern int IO_Digital_Flag; int main(void) { delay_init(168); //初始化延时函数 LED_Init(); //初始化LED端口 BEEP_Init(); //初始化蜂鸣器端口 NVIC_Config_IO(); // EXTI_GPIO_Congig(); EXTI_Config(); while(1) { // GPIO_ResetBits(GPIOF,GPIO_Pin_9); // DS0拉低,亮 等同LED0=0; // GPIO_ResetBits(GPIOF,GPIO_Pin_8); //BEEP引脚拉低, 等同BEEP=0; // delay_ms(300); //延时300ms GPIO_SetBits(GPIOF,GPIO_Pin_9); // DS0拉高,灭 等同LED0=1; // GPIO_SetBits(GPIOF,GPIO_Pin_8); //BEEP引脚拉高, 等同BEEP=1; // delay_ms(300); //延时300ms } }[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。