OpenEdv-开源电子网

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

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

[复制链接]

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2012-11-21
在线时间
9 小时
发表于 2015-10-4 15:37:34 | 显示全部楼层 |阅读模式
5金钱

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\r\n"); 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]


最佳答案

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

中断开的是c,应该开A,已解决
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2012-11-21
在线时间
9 小时
 楼主| 发表于 2015-10-4 15:37:35 | 显示全部楼层
中断开的是c,应该开A,已解决
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 09:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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