外部中斷: EXTI0-----EXTI15 (由于中斷向量表有限,有幾個中斷公用一個中斷向量) 中斷向量表(內中斷(灰色區域)和外中斷) 其中 PA0--PG0對應的使EXTI0 PA1--PG1對應的是EXTI1 ....... PA15--PG15對應的是EXTI15 外部終端應用:
實例: 以PA0引腳位外部終端輸入引腳,實現以下功能:每產生一次外部終端,PA1所接入的LED等的狀態取反。 程序編程步奏: 第一步: 首先配置引腳模式(PA0輸入上拉50MHz,PA1推挽輸出50MHz) void FUN_GPIO_Config(void) { GPIO_InitTypeDef GPIO_Config; //設置GPIOA模式 GPIO_Config.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出 GPIO_Config.GPIO_Pin=GPIO_Pin_1; GPIO_Config.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Config); GPIO_InitTypeDef GPIO_Config2; //設置GPIOA模式 GPIO_Config2.GPIO_Mode=GPIO_Mode_IPU;//上拉輸入GPIO_Config2.GPIO_Pin=GPIO_Pin_0; GPIO_Config2.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Config2); } 第二步:配置外部中斷初始化 void FUN_EXIT_Config(void) { EXTI_InitTypeDef EXTI_InitStructure;
EXTI_ClearFlag(EXTI_Line0);//清除 EXTI 線路掛起標志位,使中斷響應及時 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//將PA0設置為中斷引腳
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//PA0對應的 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿觸發 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }
第三步:時鐘使能配置 void FUN_SystemClock_Config(void) { SystemInit();//系統時鐘初始化 //初始化GPIOB的時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打開A管腳時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打開GPIO的輔助功能時鐘 }
第四步:中斷優先級配置 /* 配置中斷優先級NVIC */ void FUN_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
第五步:中斷服務函數配置 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)==1) { EXTI_ClearFlag(EXTI_Line0);//清除 EXTI 線路掛起標志位,使中斷響應及時 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)) GPIO_ResetBits(GPIOA,GPIO_Pin_1); else GPIO_SetBits(GPIOA,GPIO_Pin_1); } } 最后,編寫主函數 int main(void) { //系統初始化部分 FUN_SystemClock_Config();//時鐘初始化 FUN_GPIO_Config();//IO初始化 FUN_EXIT_Config();//外部中斷初始化 FUN_NVIC_Config();//中斷優先級初始化
while(1); }
總結: [size=10.5000pt]1.時鐘:掛載引腳的復用功能時鐘(RCC_APB2Periph_AFIO),掛載輸出引腳的時鐘(RCC_APBPeriph_GPIOA),以及首先初始化(System_Init())。 [size=10.5000pt]2.引腳模式:PA0,上拉輸入(中斷輸入引腳);PA1,推挽輸出。 [size=10.5000pt]3.中斷配置:參數配置結構體 typedef struct
{
u32 EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTIrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd;
} EXTI_InitTypeDef; 除此之外,還需要指定中斷引腳(GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0))。清除中斷標志位(EXTI_ClearFlag(EXTI_Line0))。 [size=10.5000pt]4.中斷優先級配置 NVIC_InitTypeDef NVIC_InitStructure這個結構體的參數 5.中斷服務函數 void EXTI0_IRQHandler(void);
這些步奏缺一不可。
|