嵌入式中nvic什么意思hal库中断服务函数

转载自http://www.openedv.com/forum.php? mod=viewthreadtid=275832page=1

STM32的中断控制是分级管理的,并且CM3内核中的NVIC在顶层,每个信道设有1比特的中断挂起比特。

但是,每个通道可能有多个中断源,如EXTI5_9_IRQn,这对NVIC来说只是一个通道,但实际上它包含五个中断源。

因此,在下层,需要实现对这些多个中断源的独立监视。 这就是EXTI-PR中的锁定。

STM32的中断系统可以分为两个阶段进行管理,

顶层当然是CM3内核强大的NVIC,底层外设在色彩鲜艳的电影之上。

对NVIC来说,其最特异的胡萝卜管理256个不同的中断通道,

这256个中断剩下16个核心,剩下的一般称为外部中断。 请注意不要与EXTI混淆。 EXTI是外部中断的一小部分,全部称为外部线路中断。 )外部中断最多可达240个) )具体芯片只实现了约60个以上。

在CM3核心中,这240个中断通道在每个中断中都具有以下标准控制:

1、中断优先级寄存器IP:8位一般芯片只具体实现了能够表现高位4位的16个优先级) )。

2、中断使能SETENA:1 :写为1位、1使能、0无效

3、中断禁用CLRENA:1位,写1禁用,写0无效。 它们是联动的,实际上相当于1位,放置SETENA位以启用,放置CLRENA位以禁用

4、中断挂起SETPEND:1位,写入1挂起,写入0无效,收到中断请求但暂时不能服务时,置1,进入中断服务后硬件清零

5、中断CLRPEND:1解除: 1位,写1解除,写0无效。 它们是联动的,实际上相当于1位,放置SETPEND位以锁定,放置CLRPEND位以解除锁定

6、中断活动状态活动: 1位。 指示此中断是否处于活动状态。 只读,进入中断服务程序后通过硬件设置,直到中断服务返回并通过硬件清除。

在这些内核寄存器位)中,用户编程中常用的主要是前三项。 我们需要使用某个中断的时候,首先设定优先顺序。 在ENABLE中断中,库函数执行的是这前三项的设定。 使用寄存器编程的同学也经常直接操作。

后三项几乎不能使用用户编程。 包括使用寄存器编程的学生在内,感觉不到它们的存在,没有特殊需求的就交给硬件自由操作。

NVIC是如何访问这些许多寄存器和控制位的呢? 就是中断频道号码。

NVIC唯一识别的ID,即中断通道编号,明确地说是0-239的车牌IRQn。

NVIC基于该号码寻找适当的控制位或寄存器)以实现管理这个240个中断信道的目的。

根据该号码,也可以从向量表中找到对应的中断服务程序入口地址偏移=0x0000 0040 IRQn*4)

其实,可以说NVIC强大,也可以说是笨蛋。 它实际上不知道中断的具体来头,只是照章办事。

IRQ到来后,根据IRQn编号的值检查适当的控制位或寄存器),严格进行以下流程。

1、首先,看该IRQ是否有效。 只有有效位为1时才能受理申请。 禁止状态时,直接无视;

2、然后,调查优先级寄存器IP[IRQn]、该IRQ的优先级;

3、查看活动状态,所有当前活动中断;

4、有活动状态中断时,即正在服务时,进行中断优先级比较。 如果活动中断的优先级较高,请首先挂起此IRQ。

重复此步骤,直到不再有高优先级的中断。

5、该IRQ进入服务号从查号表进入相应的中断服务程序,服务开始后,相应的中断活动状态位),解除挂起。

在第5步中,NVIC执行锁定和锁定操作。 这是CM3内核硬件自动完成的。

但是,也允许软件手动干预。 手动锁定相当于来一次软件IRQ申请,手动解除锁定相当于软件取消IRQ申请。

各种片上外围设备的中断控制属于NVIC的下属机构。

需要注意的是,这些下属机构根据上面的说明,如果一个IRQ号和一个下属机构计算,最特异的胡萝卜会达到240个。

如果一个IRQ号码只有一个中断源,就很简单了。 下属机构不需要额外的控制功能。

直接由NVIC托管,在NVIC的中断中启用、中断保留位即可。

然而,实际上,在很多情况下,每个IRQ的中断源往往有多个。

因此,需要在外围设备中添加控制功能。

不同外围设备设定的控制功能可能略有不同,名称也可能不同,但万变不离其宗,基本上有以下控制。

切断或有效) ) ) ) )。

中断或标志)。

前者进行控制,后者显示状态。

例如,EXTI5_9_IRQn对于NVIC来说只是中断,号码为23

但实际上包括五个中断源。 这是NVIC不知道的。 EXTI5_9_IRQn是我们创造的符号,实际上是常数,值为23

这五个中断源具体由下属机构管理,必须各有:

中断屏蔽是否接受此中断请求EXTI-IMR中) ) ) ) ) ) )。

中断位:是否发生此中断请求EXTI-PR中) ) ) )。

如果这5个中的任一个或多个触发了中断条件上升/下降等),则在硬件上设置对应的中断挂起,如果打开对应的一个或多个中断掩码,则发生在NV上

IC发出EXTI5_9_IRQn号中断请求
至于这个EXTI5_9_IRQn是谁发的,是EXTI5、EXTI6、EXTI7、EXTI8还是EXTI9申请了中断? NVIC是无从知道的,它也管不了那么多。
软件如果需要的话,可以通过调阅监控记录来了解细节,而这个监控记录就是在外设中实现的中断挂起位。
在STM32的外部线中断EXTI系统中,共有19条外部中断线,每一条都有相应的中断挂起位,即EXTI->PR的BIT18:0,满足中断条件后,由硬件置位,并一直保持(随便等待调阅监控),直到由软件手动清除。
注:19条是目前常用芯片具体实现的数目,有些互联型的是20条,EXTI各用一个字来设置中断屏蔽位和中断挂起位,理论上最专一的胡萝卜扩展能力为可以表达32条外部中断线

STM32的外部线中断共19条,而对于NVIC来说,实际上只有10个通道,具体如下:
内核值(IRQn) 助记符 备注
6 EXTI0_IRQn PX0(即PA0-PG0口线)
7 EXTI1_IRQn PX1口线
8 EXTI2_IRQn PX2口线
9 EXTI3_IRQn PX3口线
10 EXTI4_IRQn PX4口线
23 EXTI5_9_IRQn PX5-PX9口线
40 EXTI15_10_IRQn PX10-PX15口线
1 PVD_IRQn 电压监测
41 RTC_IRQn RTC闹钟
42 USB_IRQn USB唤醒

为进一步加深理解,我们从中断控制的角度来看一下串口1
虽然说只是一个串口,从中断控制的角度来看,也算是NVIC一个比较典型的下级机构,
对于NVIC来说,串口1只分配到了一个中断通道USART1_IRQn,编号值为37
但USART1的中断源是非常多的,
常用的有:
RXNE接收缓冲区非空中断
TC发送完成中断
TXE发送缓冲区空中断
其它的还有IDLE中断、CTS中断、错误中断等等,总计不下十种。
但这些,NVIC都是一概不管的,对NVIC只能算一个中断!!!。

具体各类小中断的细分都是由串口1的外设来实现,具体实现套路是:
每一种小中断必有相应的屏蔽位(有时候称为中断允许位xxIE, 一般在控制寄存器CR中),
另外必有相应的标志位(名称如RXNE、TC、TXE等,一般在状态寄存器中),相当于挂起位,在满足触发条件时由硬件置位,并一直保持(随便等待调阅监控)

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注