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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章