基础知识
1、外部中断/事件框架: STM32F407一共有16+7条中断/事件线(如下图),也就是说在STM32工作过程中同时支持22条外部中断/事件。

从上图也可以看出,所有的GPIO口都可以当作外部中断/事件源。但是同时只能有16条位于不同的GPIO口上的中断/事件源。
2、中断/事件源配置: 选择EXIT0-16中断/事件线的中断/事件源在相应的SYSCFG_EXTICRx寄存器里配置。如配置EXIT0-3中断/事件线的源寄存器为下图:

3、中断与事件: 在这里我们需要辨识以下中断与事件的区别:
中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;
事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;
代码设计
.c代码
void mpuIntInit(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//开启相关时钟
RCC_AHB1PeriphClockCmd(MPU_EXIT_RCCPERIPH, ENABLE);
//GPIO设置-下拉输入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = MPU_EXIT_GPIO_PIN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;//大于等于50最好开启IO补偿
GPIO_Init(MPU_EXIT_GPIO, &GPIO_InitStruct);
//EXIT设置-中断模式上升沿触发
EXTI_InitStruct.EXTI_Line = MPU_EXTI_LINE;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
//NVIC设置-中断配置
NVIC_InitStruct.NVIC_IRQChannel = MPU_EXIT_IT_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//最高
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//中断源配置-PA1
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
}
void MPU_EXIT_IT_HANDLER()
{
if(EXTI_GetITStatus(MPU_EXTI_LINE) == SET)
{
EXTI_ClearITPendingBit(MPU_EXTI_LINE);
printf(“coming”);
}
}
.h代码
#define MPU_EXIT_GPIO GPIOA
#define MPU_EXIT_GPIO_PIN GPIO_Pin_1
#define MPU_EXIT_RCCPERIPH RCC_AHB1Periph_GPIOA
#define MPU_EXTI_LINE EXTI_Line1
#define MPU_EXIT_IT_IRQn EXTI1_IRQn
#define MPU_EXIT_IT_HANDLER EXTI1_IRQHandler
#define MPU_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA
#define MPU_EXTI_PIN_SOURSE EXTI_PinSource1
void mpuIntInit(void);
void MPU_EXIT_IT_HANDLER(void);
总结
一般配置外部中断/事件一般步骤:
1、先配置对应GPIO的时钟;
RCC_AHB1PeriphClockCmd
2、初始化配置GPIO(根据触发方式设置上下拉模式);
GPIO_Init
3、初始化配置EXTI中断线;
EXTI_Init
4、如需中断则初始化配置NVIC
NVIC_Init
5、设置中断线的中断源
SYSCFG_EXTILineConfig
基础知识
1、外部中断/事件框架: STM32F407一共有16+7条中断/事件线(如下图),也就是说在STM32工作过程中同时支持22条外部中断/事件。

从上图也可以看出,所有的GPIO口都可以当作外部中断/事件源。但是同时只能有16条位于不同的GPIO口上的中断/事件源。
2、中断/事件源配置: 选择EXIT0-16中断/事件线的中断/事件源在相应的SYSCFG_EXTICRx寄存器里配置。如配置EXIT0-3中断/事件线的源寄存器为下图:

3、中断与事件: 在这里我们需要辨识以下中断与事件的区别:
中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;
事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;
代码设计
.c代码
void mpuIntInit(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//开启相关时钟
RCC_AHB1PeriphClockCmd(MPU_EXIT_RCCPERIPH, ENABLE);
//GPIO设置-下拉输入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = MPU_EXIT_GPIO_PIN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;//大于等于50最好开启IO补偿
GPIO_Init(MPU_EXIT_GPIO, &GPIO_InitStruct);
//EXIT设置-中断模式上升沿触发
EXTI_InitStruct.EXTI_Line = MPU_EXTI_LINE;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
//NVIC设置-中断配置
NVIC_InitStruct.NVIC_IRQChannel = MPU_EXIT_IT_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//最高
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//中断源配置-PA1
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);
}
void MPU_EXIT_IT_HANDLER()
{
if(EXTI_GetITStatus(MPU_EXTI_LINE) == SET)
{
EXTI_ClearITPendingBit(MPU_EXTI_LINE);
printf(“coming”);
}
}
.h代码
#define MPU_EXIT_GPIO GPIOA
#define MPU_EXIT_GPIO_PIN GPIO_Pin_1
#define MPU_EXIT_RCCPERIPH RCC_AHB1Periph_GPIOA
#define MPU_EXTI_LINE EXTI_Line1
#define MPU_EXIT_IT_IRQn EXTI1_IRQn
#define MPU_EXIT_IT_HANDLER EXTI1_IRQHandler
#define MPU_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA
#define MPU_EXTI_PIN_SOURSE EXTI_PinSource1
void mpuIntInit(void);
void MPU_EXIT_IT_HANDLER(void);
总结
一般配置外部中断/事件一般步骤:
1、先配置对应GPIO的时钟;
RCC_AHB1PeriphClockCmd
2、初始化配置GPIO(根据触发方式设置上下拉模式);
GPIO_Init
3、初始化配置EXTI中断线;
EXTI_Init
4、如需中断则初始化配置NVIC
NVIC_Init
5、设置中断线的中断源
SYSCFG_EXTILineConfig
举报