查看: 975|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-7 14:56:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
io中断配置的是PA1口,

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

进不去中断??



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

01
#include "IO_Digital.h"
02
#include "sys.h"
03

04
//
05
//0.设置外部中断源和优先级
06
//可能要改名字?
07
void NVIC_Config_IO(void)
08
{
09
  NVIC_InitTypeDef NVIC_InitStructure;
10
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置中断优先级分组
11

12
  /* Enable the USARTx Interrupt */
13
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
14
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
15
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
16
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
17
  NVIC_Init(&NVIC_InitStructure);
18
}
19

20
//
21
//1、打开PA时钟,设置PA0引脚为输入。
22
void EXTI_GPIO_Congig(void)
23
{
24
  GPIO_InitTypeDef GPIO_InitStructure;
25
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);  //PA
26
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); //SYSCFG 2.打开系统配置控制器时钟。
27

28
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
29
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      //按键实验是上拉输入
30
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
31

32
//  GPIO_InitStructure.GPIO_Pin  = GPIO_PinSource0;
33
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;            //PA1
34
  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz;
35
  GPIO_Init(GPIOA,&GPIO_InitStructure);                 //最后把gpio初始化结构体的参数写入寄存器中
36
}
37

38
//
39
//3、配置外部中断EXTI的工作方式.
40
//   映射到PA0,即线0,使用中断模式下降沿触发。
41
//   设置EXTI寄存器的工作方式交给了库函数。
42
void EXTI_Config(void)
43
{
44
  EXTI_InitTypeDef EXTI_InitStructure;
45
  EXTI_GPIO_Congig();                                              //也是自己写的
46

47
  //因为要用的IO口做中断源,故IO的复用功能必须使能.
48
  //GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);    //这是以前的F103所用的配置函数
49
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1);    //407使用的配置函数
50

51
  EXTI_InitStructure.EXTI_Line = EXTI_Line1;
52
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
53
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
54

55
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;       //下降沿,中断模式下降沿触发
56
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
57

58
  EXTI_Init(&EXTI_InitStructure);
59
}
60

61
//
62
//4、编写中断处理函数,实现向串口打印信息。
63
//   固定的函数名:void EXTI1_IRQHandler(void)。
64
//   进入中断处理函数后,首先检查是否为线0的中断。如果是,则清除这个中断标志。之后就可以发送消息了。
65
//   消息发送完成之后,清除在处理外部中断期间到来的外部中断。使用EXTI_ClearITPendingBit()完成
66
int    IO_Digital_Flag;     //加入响应函数
67
void EXTI1_IRQHandler(void)
68
{
69
  if(SET == EXTI_GetITStatus(EXTI_Line1))   //此处可以判断是哪个中断line,因为不同中断线可能对应相同的中断向量
70
  {                                         //如else if(EXTI_GetITStatus(EXTI_Line11 )!= RESET)
71
//  EXTI_ClearFlag(EXTI_Line1);             //SET=1;(在IO处设置)只有下降沿才能进入中断
72
//  printf("i am in exti irqhandler\r\n");
73

74
    IO_Digital_Flag = 1;
75

76
    EXTI_ClearITPendingBit(EXTI_Line1);
77
  }
78
}


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

view sourceprint?
01
#include "sys.h"
02
#include "delay.h"
03
#include "usart.h"
04
#include "led.h"
05
#include "beep.h"
06

07
#include "IO_Digital.h"
08

09
extern int    IO_Digital_Flag;
10
int main(void)
11
{
12

13
    delay_init(168);            //初始化延时函数
14
    LED_Init();                 //初始化LED端口
15
    BEEP_Init();                //初始化蜂鸣器端口
16

17
    NVIC_Config_IO();
18
//  EXTI_GPIO_Congig();
19
    EXTI_Config();
20

21
    while(1)
22
    {
23
//      GPIO_ResetBits(GPIOF,GPIO_Pin_9); // DS0拉低,亮   等同LED0=0;
24
//      GPIO_ResetBits(GPIOF,GPIO_Pin_8); //BEEP引脚拉低, 等同BEEP=0;
25
//      delay_ms(300);                    //延时300ms
26
        GPIO_SetBits(GPIOF,GPIO_Pin_9);   // DS0拉高,灭   等同LED0=1;
27
//      GPIO_SetBits(GPIOF,GPIO_Pin_8);   //BEEP引脚拉高, 等同BEEP=1;
28
//      delay_ms(300);                    //延时300ms
29
    }
30
}
我来回答转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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