外部中斷: EXTI0-----EXTI15 (由于中斷向量表有限,有幾個中斷公用一個中斷向量) 中斷向量表(內(nèi)中斷(灰色區(qū)域)和外中斷) 其中 PA0--PG0對應(yīng)的使EXTI0 PA1--PG1對應(yīng)的是EXTI1 ....... PA15--PG15對應(yīng)的是EXTI15 外部終端應(yīng)用:
實例: 以PA0引腳位外部終端輸入引腳,實現(xiàn)以下功能:每產(chǎn)生一次外部終端,PA1所接入的LED等的狀態(tài)取反。 程序編程步奏: 第一步: 首先配置引腳模式(PA0輸入上拉50MHz,PA1推挽輸出50MHz) void FUN_GPIO_Config(void) { GPIO_InitTypeDef GPIO_Config; //設(shè)置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; //設(shè)置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 線路掛起標志位,使中斷響應(yīng)及時 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//將PA0設(shè)置為中斷引腳
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//PA0對應(yīng)的 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿觸發(fā) EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }
第三步:時鐘使能配置 void FUN_SystemClock_Config(void) { SystemInit();//系統(tǒng)時鐘初始化 //初始化GPIOB的時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打開A管腳時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打開GPIO的輔助功能時鐘 }
第四步:中斷優(yōu)先級配置 /* 配置中斷優(yōu)先級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); }
第五步:中斷服務(wù)函數(shù)配置 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)==1) { EXTI_ClearFlag(EXTI_Line0);//清除 EXTI 線路掛起標志位,使中斷響應(yīng)及時 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)) GPIO_ResetBits(GPIOA,GPIO_Pin_1); else GPIO_SetBits(GPIOA,GPIO_Pin_1); } } 最后,編寫主函數(shù) int main(void) { //系統(tǒng)初始化部分 FUN_SystemClock_Config();//時鐘初始化 FUN_GPIO_Config();//IO初始化 FUN_EXIT_Config();//外部中斷初始化 FUN_NVIC_Config();//中斷優(yōu)先級初始化
while(1); }
總結(jié): [size=10.5000pt]1.時鐘:掛載引腳的復用功能時鐘(RCC_APB2Periph_AFIO),掛載輸出引腳的時鐘(RCC_APBPeriph_GPIOA),以及首先初始化(System_Init())。 [size=10.5000pt]2.引腳模式:PA0,上拉輸入(中斷輸入引腳);PA1,推挽輸出。 [size=10.5000pt]3.中斷配置:參數(shù)配置結(jié)構(gòu)體 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.中斷優(yōu)先級配置 NVIC_InitTypeDef NVIC_InitStructure這個結(jié)構(gòu)體的參數(shù) 5.中斷服務(wù)函數(shù) void EXTI0_IRQHandler(void);
這些步奏缺一不可。
|