STM32中使用GPIO作为外部中断,以如下图的方式连接到外部中断,因此在设计的时候,不能同时将中断连接在PA.1 PB.1 PC.1 PD.1 PE.1,因为同时只能选择一个中断。
外部中断初始化,一个重要的结构体EXIT_InitTypeDef;
typedef struct
{
uint32_t EXTI_Line; //EXTIx,设定是哪个外部中断EXTI_0,EXTI_1,EXTI_2....EXTI_15
EXTIMode_TypeDef EXTI_Mode; //设定是中断还是事件 Interrupt or Event
EXTITrigger_TypeDef EXTI_Trigger; //触发的方式,上升沿,下降沿,上升-下降过程转换
FunctionalState EXTI_LineCmd; //使能或禁止 Enable or Disable
}EXTI_InitTypeDef;
在GPIO用作外部中断首先需要将EXTIx和具体的GPIO口对应起来,选择GPIO管脚用作外部中断线路
void GPIO_EXTILineConfig(u8 GPIO _PortSource, u8 GPIO_PinSource)
GPIO_PortSource: 选择用作外部中断线源的 GPIO端口
GPIO_PinSource :待设置的外部中断线路
然后对结构体EXIT_InitTypeDef进行初始化
EXTI_InitStructure.EXTI_Line = GPIO_KEY1_EXTI_LINE; //使用的中断线为EXTI_x
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //外部中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能
EXTI_Init(&EXTI_InitStructure);//初始化
EXIT_Init(&EXTI_InitStructure )根据EXTI_InitStruct 中指定的参数初始化外设 EXTI寄存器 。
连续初始化外部EXTI时,只需要修改EXTI_InitStruct.EXTI_Line参数就行了,然后在调用EXIT_Init(&EXTI_InitStructure )函数进行初始化
GPIO_EXTILineConfig(GPIO_KEY2_EXTI_PORT_SOURCE, GPIO_KEY2_EXTI_PIN_SOURCE);//另外一个端口的GPIO管脚作为中断线
EXTI_InitStructure.EXTI_Line = GPIO_KEY2_EXTI_LINE;//修改EXTI_Line参数
EXTI_Init(&EXTI_InitStructure); //再次进行初始化
中断函数里面
void EXTIx_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Linex) != 0)//检查指定的EXTI线路触发请求发生与否
{
... ... // do something
/* Clear the EXTI Line 0 */
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI线路挂起位
}
}