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