使用 IO 口外部中断的一般步骤:
1)初始化 IO 口为输入。
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
3)初始化线上中断,设置触发条件等。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。
基础知识略过,
第一步.配置 GPIO 与中断线的映射关系的函数
1 void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
配置实例:
1 void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOI, uint8_t EXTI_PinSource8)
将中断线 8 与 GPIOI 映射起来,那么很显然是 GPIOI.8 与 EXTI8 中断线连接了。设置好中断线映射之后,那么到底来自这个IO口的中断时通过什么方式出发的呢?接下来我们就要设置该中断线上中断的初始化参数了。
第二步.中断线上中断的初始化是通过函数 EXTI_Init()实现的。EXTI_Init()函数的定义是:
1 void EXTI_Init ( EXTI_InitTypeDef * EXTI_InitStruct )
下面我们用一个使用范例来说明这个函数的使用:
1 EXTI_InitTypeDef EXTI_InitStructure; 2 EXTI_InitStructure.EXTI_Line=EXTI_Line8; 3 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 4 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 5 EXTI_InitStructure.EXTI_LineCmd = ENABLE; 6 EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的 7 //参数初始化外设 EXTI 寄存器
STM32 的外设的初始化都是通过结构体来设
置初始值的,这里就不罗嗦结构体初始化的过程了。我们来看看结构体 EXTI_InitTypeDef 的成员变量:
1 typedef struct 2 { 3 uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. 4 This parameter can be any combination value of @ref EXTI_Lines */ 5 6 EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. 7 This parameter can be a value of @ref EXTIMode_TypeDef */ 8 9 EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. 10 This parameter can be a value of @ref EXTITrigger_TypeDef */ 11 12 FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. 13 This parameter can be set either to ENABLE or DISABLE */ 14 }EXTI_InitTypeDef;