STM32之EXTI篇

//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);
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值