外部中断: 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);
这些步奏缺一不可。
|