STM32外部中断使用与说明
1.主要特性
1.1 检测脉冲宽度低于APB2时钟宽度的外部信号
1.2每个中断/事件都有独立的触发和屏蔽
1.3 每个中断都有专用的状态位
1.4 支持多达20个软件的中断/事件请求
2. 结构框架图
3. 操作步骤
3.1 使用外部硬件中断步骤如下:
①配置GPIO操作;
②配置对应的外部中断通道的中断使能位;
③配置触发沿,选择选择上升沿触发或者下降沿触发或者双边沿触发;
④在内核的NVIC中配置EXTI中断,以保证其可以正确的响应。
3.2 使用外部硬件事件步骤:
①配置GPIO操作;
②配置对应的外部通道的事件使能位
③配置触发沿,选择选择上升沿触发或者下降沿触发或者双边沿触发。
3.3 使用软件中断/事件步骤:
①使能外部中断或者外部事件;
②如果使用中断服务函数,需要设置内核的NVIC里EXTI中断;
③设置软件中断触发,即会产生中断。
4.EXTI中断映射
外部中断/事件线路 | 映射事件描述 |
---|
EXTI0~EXTI15 | Px0~Px15(x=A/B/C/D),任何一个IO口都可以启用外部中断/事件功能,由AFIO_EXTICRx寄存器配置 |
EXTI16 | PVD事件:超出电压监控阀值 |
EXTI17 | RTC闹钟事件 |
EXTI18 | USB唤醒中断事件 |
EXTI19 | 以太网唤醒事件(只适用于互联型产品) |
5.中断配置库的名称和说明
5.1 PFIC库函数
序号 | 函数名称 | 函数说明 |
---|
1 | NVIC_PriorityGroupConfig | 优先级分组配置 |
2 | NVIC_Init | 根据NVIC_InitStruct中指定参数配置寄存器 |
5.2 EXTI函数库
序号 | 函数名称 | 函数说明 |
---|
1 | EXTI_DeInit | 将EXTI寄存器设置为初始值 |
2 | EXTI_Init | 将EXTI_InitTypeDef中指定参数初始化EXTI寄存器 |
3 | EXTI_StructInit | 将EXTI_InitTypeDef中每个参数按照初始值填入 |
4 | EXTI_GenerateSWInterrupt | 产生一个软件中断 |
5 | EXTI_GetFlagStatus | 检查指定的EXTI线路状态标志位 |
6 | EXTI_ClearFlag | 清除EXTI线路挂起标志位 |
7 | EXTI_GetITStatus | 检查指定的EXTI线路是否触发请求 |
8 | EXTI_ClearITPendingBit | 清除EXTI线路挂起位 |
6.外部中断使用流程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIygxHmu-1635493268116)(C:\Users\30626.LAPTOP-0B6URHNA\AppData\Roaming\Typora\typora-user-images\image-20211029152106416.png)]
7.外部中断配置代码示范
void EXTI_NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel=EXTI3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
EXTI_NVIC_Config();
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource3);
EXTI_InitStruct.EXTI_Line=EXTI_Line3;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);
}
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)
{
printf("Run at EXTI\r\n");
EXTI_ClearITPendingBit(EXTI_Line3);
}
}