EXTI
- 一、什么是EXTI
- 二、配置步骤
- 1. 初始化GPIO
- 2. 配置SYSCFG
- 3. 配置EXTI
- 4. 配置NVIC
- 5. 编写中断服务函数
- 三、注意事项
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是EXTI
EXTI(外部中断/事件控制器)。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
二、配置步骤
1. 初始化GPIO
首先,需要将目标引脚配置为输入模式。例如,将GPIOA的Pin0配置为输入模式:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 输入模式,带上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 选择引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置速度
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIO
2. 配置SYSCFG
将GPIO引脚映射到EXTI中断线上。例如,将GPIOA的Pin0映射到EXTI_Line0:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 将GPIOA的Pin0映射到EXTI_Line0
3. 配置EXTI
指定中断触发条件(上升沿、下降沿或双边沿):
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0; // 选择中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线
EXTI_Init(&EXTI_InitStructure); // 初始化EXTI
4. 配置NVIC
另一篇文章:NVIC详细介绍(点击跳转)
在NVIC中使能对应的中断优先级:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 配置NVIC优先级分组
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化NVIC
5. 编写中断服务函数
函数名固定
编写中断服务函数来处理中断请求:
void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line0) == SET) // 检查中断标志{// 处理中断逻辑// 例如,读取GPIO状态if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0){// 执行相关操作}EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志}
}
三、注意事项
- 不同GPIO口相同Pin不能同时触发中断:原因是在AFIO进行中断引脚选择时,一个Pin只能对应一个GPIO口。
- 中断嵌套:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。能否进行中断嵌套,也是由中断优先级来决定的。
总结
声明:
本文为本人的学习笔记,旨在记录和分享个人在学习过程中的心得体会和原创代码。由于本人刚入门,对相关知识的理解可能还存在不足之处,文章中难免会有错误或不准确的地方。在此,我诚挚地欢迎各位读者在阅读过程中,如果发现任何问题或有其他建议,随时在评论区或通过其他方式与我交流。我将虚心听取大家的意见,及时修正和改进文章内容,以便更好地学习和成长。感谢大家的关注和支持!