提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
stm32 EXIT(中断)配置及应用分析
前言
中断在单片机是必学的内容,我们谈谈应用的地方和什么场景该用。
1.人们都说的突发事件,当我们正在进行什么事情时,外部发进来的信号或指令。(列如:吃饭时,突然的电话,接完电话继续吃饭)。
中断产生都是被某信号或指令打断然后执行中断内的内容。
(个人看法,用什么思路我们可以共同交流)
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、中断是什么?
中断:执行事情时突然发生的指令,当实行完这件指令后我们继续执行原来的事情。(重指令打断的地方开始继续下面的)
二、使用步骤
1.中断初始化配置
这里用来两个不同外接电压的按键来分别触发两个中断
分别配置了他们的优先级
代码如下(示例):
void EXIT_NVIC_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO将每个引脚映射在中断上(由引脚产生中断必须配置次函数)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
//中断优先处理配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //中断源(那个引脚)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //响应级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; //中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
//配置外部中断引脚。外接高电压
EXTI_InitStructure.EXTI_Line=EXTI_Line0; //外部中断引脚映射
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //选择触发方式(事件EXTI_Mode_Event|中断EXTI_Mode_Interrupt)
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //什么研触发(上升EXTI_Trigger_Rising|下降EXTI_Trigger_Falling|边沿EXTI_Trigger_Rising_Falling)(上升就是0-1,下降就是1-0的过程)
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能
EXTI_Init(&EXTI_InitStructure);
//外接地
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
2.中断产生执行函数
代码如下(示例):
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI0_IRQn)==1) //判断是否误产生中断
{
Delay(20);
if(EXTI_GetITStatus(EXTI0_IRQn)==1) //因为我的是按键触发所以怕误操作而进行了消抖
{
}
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位(为了跳出中断了回到主程序和为下一次触发中断做准备)
}
void EXTI3_IRQHandler()
{
if(EXTI_GetITStatus(EXTI3_IRQn)==1)
{
Delay(20);
if(EXTI_GetITStatus(EXTI3_IRQn)==1)
{
}
}
EXTI_ClearITPendingBit(EXTI_Line3);
}
---
# 总结
配置中断是我们都应该配置下中断优先级养成良好的习惯