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
}
我来回答转载
|