STM32自学笔记 第四篇,中断EXTI与中断优先级NVIC

EXTI指的就是中断正在做的程序,去做另外一件事
NVIC指的是当两个或者多个中断来临时按照优先级进行一个一个进行处理
优先级分为抢占优先级和响应优先级;
抢占优先级是指可以打断别的中断进行中断;例如若中断2的抢占优先级高于中断1,在执行中断1当中断2来临时,中止中断1先执行中断2,结束在执行中断1;
响应优先级是指在抢占优先级一致时,先执行响应优先级高的中断,
中断向量 抢占优先级 响应优先级
X | 0 | 0 |
Y | 1 | 0 |
Z | 1 | 1 |
若程序正在执行中断Z;此时中断X,与中断Y同时来到,则中止中断Z,开始执行中断X,结束后再继续执行中断Z;
若程序正在执行中断X,此时中断Z,与中断Y同时来到,则执行完中断X再执行中断Y,在执行中断Z;
优先级有十六种变换;有5种组合方式;
NVIC_PriorityGroup_0;NVIC_PriorityGroup_1;NVIC_PriorityGroup_2;NVIC_PriorityGroup_3;NVIC_PriorityGroup_4;
NVIC_PriorityGroup_0;这一组合是16种抢占优先级,1种响应优先级
16x1=16种变换
NVIC_PriorityGroup_1;这一组合是8种抢占优先级,2种响应优先级
8x2=16种变换
NVIC_PriorityGroup_2;这一组合是4种抢占优先级,4种响应优先级
4x4=16种变换
NVIC_PriorityGroup_3;这一组合是2种抢占优先级,8种响应优先级
8x2=16种变换
NVIC_PriorityGroup_4;这一组合是1种抢占优先级,16种响应优先级
1x16=16种变换
在下文加入程序叙述
中断分为外部中断和内部中端;
内部中断时单片机本身设置好的响应标志,和等级
外部中断,单片机对于GPIO提供19个外部中断,0–15个引脚占据16个中断通道,另外三个通道分别留个RTC,PVD,USB使用
依程序为例
若我们想使用GPIOA引脚2和3做外部中断输入口,则除了打开时钟GPIOA ,还应该在函数里折磨匹配
void GPIO_Confiuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
//定义GPIOA.2为外部中断2,输入通道EXTI2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource3);
//定义GPIOA.3为外部中断3,输入通道EXTI3
}
void EXTI_Confiuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line2|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);
}
//定义变量
//选择相应通道
//设置响应模式 EXTI_Mode_Interrupt;响应中断请求
EXTI_Mode_Event;响应事件请求
//设置触发方式 EXTI_Trigger_Falling;下降沿响应请求
EXTI_Trigger_Rising;上降沿响应请求
EXTI_Trigger_Rising_Falling;上升沿和下降沿响应请求
//使能中断
此时我们还需要设置EXTI2和EXTI3的NVIC
void NVIC_Confiuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//定义变量
//设置组数,第2组模式,所以抢占优先级4种,响应优先级4种;

//设置EXTI2
//设置抢占优先级0
//设置响应优先级0
//使能

//设置EXTI3
//设置抢占优先级1
//设置响应优先级1
//使能
响应的函数
void EXTI2_IRQChannel(void)
{
EXTI_ClearFlag(EXTI_Line2);//清除中断标志
//加入要做的事
}
void EXTI3_IRQChannel(void)
{
EXTI_ClearFlag(EXTI_Line);//清除中断标志
//加入要做的事
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值