//file:exti.h
#include "stm32f10x.h"
#include "delay.h"
/*
基本步骤:
1、初始化I/O端口为输入,开启时钟
2、开启端口复用时钟,设置I/O端口与中断线的映射关系
3、配置相对的EXTI,初始化EXTI设置
4、配置中断分组NVIC,使能
5、中断服务函数编写
详细参考下面三个函数
*/
void NVIC_Config(void); //对NVIC中断管理进行配置
//里面的中断优先级分组,为不改变中断的优先级 只要初始化一次
void Exit_Set(void); //EXTI中断配置
void EXTI4_IRQHandler(void); //中断服务函数名在启动文件.s中
/****************************常用的EXTI库函数**************************************/
/*
//获取EXTI线路标志位
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
//检查指定的EXTI线路触发请求发生与否
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//清除EXTI线路标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);
//清除EXTI线路挂起位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line); //这两个函数的功能相同
//产生软件中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
关于中断相应函数
EXTI0~EXTO4 有各自的中断响应函数
EXTI5~9 共用一个中断响应函数
EXTI10~15 共用一个中断响应函数
*/
//file:exti.c
#include "EXTI.h"
void Exit_Set(void) //设置中断
{
GPIO_InitTypeDef GPIO_InitStruct; //需产生外部中断IO
EXTI_InitTypeDef EXTI_InitStruct; //配置EXTI的内容
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启端口复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //开启相对应GPIO时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE, &GPIO_InitStruct); //设置GPIO引脚的模式
EXTI_InitStruct.EXTI_Line = EXTI_Line4; //配置产生中断线
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //选择产生中断还是事件
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //这里是下降沿触发模式
EXTI_InitStruct.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStruct); //初始化设置
//设置I/O端口与EXTI中断线的映射关系
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
}
void NVIC_Config(void) //设置中断优先级
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//在工程中,只需要对此函数初始化一遍,可提出来在主函数中使用
NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn; //需产生中断的外设
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; //子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStruct);
}
//中断服务函数参考
void EXTI4_IRQHandler(void)
{
static uint8_t num = 0;
if(EXTI_GetFlagStatus(EXTI_Line4))
{
delay_ms(5);
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
{
num = !num;
GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)num);
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)!num);
}
EXTI_ClearFlag(EXTI_Line4);
}
}