单片机-STM32中断概念与配置(三)

目录

一、中断概念

1.为什么要用中断???

2.中断流程:

3.向量中断

4.优先级:

5.中断的嵌套

二、STM32单片机中断应用

1.外部中断

2.优先级

3.外部中断(exti)

三、按键中断实现流程

1.中断配置部分:

1)EXTI_IMR寄存器

2)EXTI_RTSR上升沿触发寄存器

3)EXTI_FTSR下降沿触发寄存器

4)将PE4管脚映射(绑定)到EXTI4中断线上

5)中断服务程序


一、中断概念

中断是一种硬件处理机制--只要配置好中断的触发事件,那么接下来可以不用软件轮询去查看,一切都交给CPU去处理。

中断事件(触发事件/中断源):触发中断的一个标志 (事件--ST规定的)

入栈:当事件触发之后,需要将原来的代码以及临时变量进行保存,保存在栈区

中断服务函数:中断发生之后,我们需要去处理的事情都在此函数中进行

尽量避免大量的延时函数,不能有while(1)等死循环

出栈:将中断触发的时候,保存的主函数代码及临时变量取出来,继续执行

中断的定义:

中断是指设备运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行

例如:

假如说你对象来找你,但是你在上课,而且来的时间不确定

当电话响了(事件)---触发事件

此时你在写代码---保存代码,下楼(入栈)

处理事务----中断服务函数(中断触发之后,执行的内容)

返回教室---继续回来敲代码(出栈)

响应中断之前需要先入栈操作

中断返回后需要出栈操作

1.为什么要用中断???

当代码量比较大的时候,为了提高CPU的运行效率问题,提出了中断。

  • 提高计算机系统效率
  • 维持系统可靠正常工作
  • 满足实时处理要求
  • 提供故障现场处理手段

2.中断流程:

按照事件发生的顺序,中断过程包括:
①中断源发出中断请求;
②判断当前处理机是否允许中断和该中断源是否被屏蔽;
③优先权排队;
④处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序,保护断点地址和处理机当前状态,转入相应的中断服务程序;
⑤执行中断服务程序;
⑥恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。
上述过程中前四项操作是由硬件完成的,后两项是由软件完成的。

3.向量中断

对应每个中断源设置一个向量(方向,有ST公司定义好的)。这些向量顺序存在主存储器的特定存储区。向量的内容是相应中断服务程序(中断服务程序的名字不能修改)的起始地址和处理机状态字。在响应中断时,由中断系统硬件提供向量地址,处理机根据该地址取得向量,并转入相应的中断服务程序。

4.优先级:

当有多个中断的时候,如何决定中断执行顺序呢??使用优先级的概念

数字越小优先级越高

5.中断的嵌套

也适用于多个中断中,中断中套用中断,当一个中断出发之后,在自己的中断服务程序中,因为某一个事件发生,出发了另外一个中断。

二、STM32单片机中断应用

中断的触发需要事件,但是不是所有的事件都可以触发中断,LED灯--控制高低电平

嵌套向量中断控制器:

● 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);

● 16个可编程的优先等级(使用了4位中断优先级);

嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。NVIC---就是内核中用于管理中断的

中断本身就是一种异常情况,只是这一种异常是可控的,有利于我们代码的执行效率的,所以说在计算机方面就大量的被使用。

在内核中我们称为异常,在内核之外的异常成为中断

Cortex-M3 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。

1.外部中断

目前在学习的过程中,和项目研发中,我们大量使用的就是外部中断(系统之外的)

2.优先级

优先级宽度:8Bit

有钻劲儿的读者可能一直在琢磨:明明支持 256 个优先级,为啥只有 128 个抢占级,剩下一半哪儿去了?原来,为了使抢占机能变得更可控, CM3 还把 256 级优先级按位分成高低两段,分别称为抢占优先级和子优先级,如下所述。

抢占优先级:可以打断正在执行的中断程序

子优先级(次级优先级):不具备打断正在执行的中断,当抢占优先级相同时,决定中断执行的顺序。

内核中优先级分为8组,每一组抢占优先级和次级优先级占的位数不同

以上是内核中的对于中断的的分配,但是ST公司拿到内核之后,重新对中断进行了优化整合,减少了中断的通道,减少了优先级。

内核中规定240个外部中断,但是ST最终只是设置了68个

内核中规定优先级总共8位(256个),但是ST最终只是4位(16个)

优先级分组:

在计算抢占优先级和子优先级的有效位数时,必须先求出下列值:

 芯片实际使用了多少位来表达优先级---4位

 优先级组是如何划分的。

举个例子,如果只使用 4个位来表达优先级([7:4]),低四位就不再使用了

系统之外的中断称为外部中断,但是在ST单片机中对于IO口的跳变产生的中断,也称为外部中断(exit)

3.外部中断(exti)

有19个能产生事件/中断请求的边沿检测器(EXTI)。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。

以KEY为例:

中断服务函数:

三、按键中断实现流程

由原理图可得,当按键被按下,到松手的这个过程中会产生一个下降沿和上升沿,由此可得,我们设置中断的触发事件就是上升沿或者下降沿

1.中断配置部分:

  • 配置19个中断线的屏蔽位(EXTI_IMR)
  • 配置所选中断线的触发选择位();
  • 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得19个中断线中的请求可以被正确地响应。

1)EXTI_IMR寄存器

2)EXTI_RTSR上升沿触发寄存器

当上升沿事件发生了,触发中断

3)EXTI_FTSR下降沿触发寄存器

下降沿触发之后,中断发生

以上中断相关的寄存器配置完成之后,后续我们就需要配置NVIC(管理中断的),我们需要去查看相关的内核文档及内核源码。

设置优先级分组:

设置优先级:

NVIC中断控制使能

4)将PE4管脚映射(绑定)到EXTI4中断线上

在我们的第八章节中有关于映射的寄存器:AFIO_EXTICR1、AFIO_EXTICR2

、AFIO_EXTICR3、AFIO_EXTICR4

打开AFIO的时钟:

void key_Interrupt_Cfg(void)
{
 RCC->APB2ENR |=(0X01<<0);
 AFIO->EXTICR[1] |=(0X04<<0);//确定映射关系
    //打开相关中线屏蔽位 EXTI4
 EXTI->IMR |=(0X01<<4);
 EXTI->RTSR |=(0X01<<4);
    //NVIC--管理中断
    //1.确定优先级分组 0--7
    NVIC_SetPriorityGrouping(5);
    NVIC_SetPriority(EXTI4_IRQn,0x06);//0x06--01 10 占先优先级1  次级优先级2
    NVIC_EnableIRQ(EXTI4_IRQn);
}

5)中断服务程序

中断服务函数的名字是确定的,不能修改的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值