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]
|