/**
* @brief EXTI Init Structure definition
*/
typedef struct
{
uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled.
This parameter can be any combination value of @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
This parameter can be a value of @ref EXTITrigger_TypeDef */
FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines.
This parameter can be set either to ENABLE or DISABLE */
}EXTI_InitTypeDef;
外部中断库函数
/* Exported macro ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/* Function used to set the EXTI configuration to the default reset state *****/
void EXTI_DeInit(void);
/* Initialization and Configuration functions *********************************/
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
/* Interrupts and flags management functions **********************************/
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
[..] In order to use an I/O pin as an external interrupt source, follow steps
below:
(#) Configure the I/O in input mode using GPIO_Init()
(#) Select the input source pin for the EXTI line using SYSCFG_EXTILineConfig()
(#) Select the mode(interrupt, event) and configure the trigger
selection (Rising, falling or both) using EXTI_Init()
(#) Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init()
[..]
(@) SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx
registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
其中
EXTI_GetFlagStatus()先判断中断是否使能,使能之后才去判断中断标志位
EXIT _GetFlagStatus()直接判断状态标志位
扩展,所有stm32中断处理函数入口
WWDG_IRQHandler PVD_IRQHandler
TAMP_STAMP_IRQHandler RTC_WKUP_IRQHandler
FLASH_IRQHandler RCC_IRQHandler
EXTI0_IRQHandler EXTI1_IRQHandler
EXTI2_IRQHandler EXTI3_IRQHandler
EXTI4_IRQHandler DMA1_Stream0_IRQHandler
DMA1_Stream1_IRQHandler DMA1_Stream2_IRQHandler
DMA1_Stream3_IRQHandler DMA1_Stream4_IRQHandler DMA1_Stream5_IRQHandler DMA1_Stream6_IRQHandler
ADC_IRQHandler CAN1_TX_IRQHandler
CAN1_RX0_IRQHandler CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler EXTI9_5_IRQHandler
TIM1_BRK_TIM9_IRQHandler TIM1_UP_TIM10_IRQHandler
TIM1_TRG_COM_TIM11_IRQHandler TIM1_CC_IRQHandler
TIM2_IRQHandler TIM3_IRQHandler
TIM4_IRQHandler I2C1_EV_IRQHandler
I2C1_ER_IRQHandler I2C2_EV_IRQHandler
I2C2_ER_IRQHandler SPI1_IRQHandler
SPI2_IRQHandler USART1_IRQHandler
USART2_IRQHandler USART3_IRQHandler
EXTI15_10_IRQHandler RTC_Alarm_IRQHandler
OTG_FS_WKUP_IRQHandler TIM8_BRK_TIM12_IRQHandler
TIM8_UP_TIM13_IRQHandler TIM8_TRG_COM_TIM14_IRQHandler
TIM8_CC_IRQHandler DMA1_Stream7_IRQHandler
FSMC_IRQHandler SDIO_IRQHandler
TIM5_IRQHandler SPI3_IRQHandler
UART4_IRQHandler UART5_IRQHandler
TIM6_DAC_IRQHandler TIM7_IRQHandler
DMA2_Stream0_IRQHandler DMA2_Stream1_IRQHandler
DMA2_Stream2_IRQHandler DMA2_Stream3_IRQHandler
DMA2_Stream4_IRQHandler ETH_IRQHandler
ETH_WKUP_IRQHandler CAN2_TX_IRQHandler
CAN2_RX0_IRQHandler CAN2_RX1_IRQHandler
CAN2_SCE_IRQHandler OTG_FS_IRQHandler
DMA2_Stream5_IRQHandler DMA2_Stream6_IRQHandler
DMA2_Stream7_IRQHandler USART6_IRQHandler
I2C3_EV_IRQHandler I2C3_ER_IRQHandler
OTG_HS_EP1_OUT_IRQHandler OTG_HS_EP1_IN_IRQHandler
OTG_HS_WKUP_IRQHandler OTG_HS_IRQHandler
DCMI_IRQHandler RYP_IRQHandler
HASH_RNG_IRQHandlerFPU_IRQHandler
这里中断函数对应关系
EXPORT EXTI0_IRQHandler ----> EXTI_Line0
EXPORT EXTI1_IRQHandler ----> EXTI_Line1
EXPORT EXTI2_IRQHandler ----> EXTI_Line2
EXPORT EXTI3_IRQHandler ----> EXTI_Line3
EXPORT EXTI4_IRQHandler ----> EXTI_Line 4
EXTI9_5_IRQHandler —-> EXTI_Line 5-9
EXTI15_10_IRQHandler —-> EXTI_Line 10-15z
3.3 初始化实例
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接中断线0
/* 配置EXTI_Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子通道优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置
void EXTI0_IRQHandler(void)
{
delay_ms(10); //Ï消抖
if(WK_UP==1)
{
BEEP=!BEEP; //电平翻转
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志
}