中断概念
中断(Interrupt)是硬件和软件驱动事件,它使得CPU暂停当前的主程序,并转而去执行一个中断服务子程序。
在DSP中,通常中断申请信号是由外围设备提出的,表示一个特殊的事件已经发生,请求CPU暂停正在执行的主程序,去处理相应的更为紧急的事件。
X2812
的中断系统从上至下分成了三级
- CPU级中断
- PIE级中断
- 外设中断
CPU中断
可屏蔽中断的响应过程如上图所示。一共有14个中断向量,这14个中断向量从上到下,优先级依次降低
- 当某个可屏蔽中断提出请求时,将其在中断标志寄存器
IFR
中的中断标志位自动置位。- CPU检测到
IFR
被置位后,接着会检测该中断是否被使能,也就是去读CPU中断使能寄存器IER
中相应位的值。- 如果
IER
并未使能,那么CPU将不会理会此中断,直到其中断被使能为止。- 如果
IER
已经被使能,则CPU会继续检查全局中断INTM
是否被使能- 如果
INTM
已经被使能,则CPU就会响应该中断,暂停主程序并转向执行相应的中断服务子程序。- CPU响应中断后,
IFR
中的中断标志位就会被自动清0,目的是使CPU能够去响应其他中断或者是该中断的下一次中断。相关说明
IFR
IFR (Interrupt Flag Register)
,它的作用是表明有中断来了,上图为它的结构,若某一位为1,说明有一个中断未处理
IER
IER(Interrupt Enable Register)
,即中断使能寄存器,结构如上图所示,一共是16位,每一位都对应一个CPU中断,这个位的值就像开关的状态,1为打开,0为关闭。也就是说某一位为1,则相对应的中断就被使能,反之则屏蔽
其中,RTOSINT
为实时操作系统中断使能位;DLOGINT
为数据记录中断使能位;
PIE中断
专门处理外设中断的拓展模块(Peripheral Interrupt Expansion Block),简称外设中断控制器PIE
,它能够对各种中断请求源(来自外设或者其他外部引脚的请求)做出判断和相应的决策
由上图可知,PIE
一共可以支持96个不同的中断(空白部分表示尚未使用的中断,目前已经使用的有45个中断),并把这些中断分成了12个组,每个组有8个中断,而且每个组都被反馈到CPU内核的INT1~INT12
这12条中断线中的某一条上。相关说明
PIE控制器相关的寄存器由如下几类:
PIECTRL
: PIE控制寄存器PIEACK
:PIE应答寄存器PIEIER1~12
:PIE,INT1~12组使能寄存器PIEIFR1~12
:PIE,INT1~12组标志寄存器PIE中断使能寄存器
PIE控制器共有12个PIE中断使能寄存器PIEIERx
(x=1~12),分别对应于PIE控制器的12个组,每组1个,用来设置组内中断的使能情况。而对应PIE组内各个中断单独使能和CPU中断使能寄存器IER
类似。PIE中断标志寄存器
PIE控制器共有12个PIE中断标志寄存器PIEIFRx
,分别对应于PIE控制器的12个组,每组1个。
PIEIFR寄存器的每一位代表对应中断的请求信号,当该位置1,表示相应的中断提出了请求,需要CPU响应。CPU取出相应的中断向量时,也就是说当CPU响应该中断时,该标志位被清0。
与CPU中断标志寄存器IFR
类似。PIE中断应答寄存器
若PIE中断控制器有中断产生,则相应的中断标志位将置1。若相应的PIE中断使能位也置1,则PIE将检查PIE中断应答寄存器PIEACK
,以确定CPU是否准备响应该中断。
- 若相应的
PIEACKx
清0,PIE便向CPU申请中断- 若相应的
PIEACKx
置1,那么PIE将等待直到相应的PIEACKx
清0才向CPU申请中断
PIEACK
的第0位对应PIE第1组中断的CPU响应情况,以此类推,第11位表示PIE第12组中断的CPU响应情况。PIE控制寄存器
PIEVECT
(位15~1),这些位表示从PIE向量表取回的向量地址。最低位忽略,只显示位1到位15地址。用户可以读取向量值,以确定取回的向量是由哪一个中断产生的
ENPIE
:从PIE块取回向量使能。
- 为1:所有向量取自PIE向量表
- 为0:PIE块无效,向量取自引导ROM的CPU向量表或XINTF7区外部接口
X281x的三级中断系统分析
如上图所示,X281x的中断采用的是三级中断机制,分别为
- 外设级
- PIE级
- CPU级
对于某一具体的外设中断请求,只要有任意一级不许可,CPU最终都不会响应该外设中断。
外设级
步骤:
- 假设在程序执行过程中,某一个外设产生了一个中断事件
- 在这个外设的某个寄存器与该中断事件相关的中断标志位(
IF=Interrupt Flag
)被置为1.- 该中断相应的中断使能位(
IE=Interrupt Enable
)已经被置位,也就是值为1- 该外设就会向PIE控制器发出一个中断请求。
- 相反,虽然中断事件已经发生了,相应的中断标志位也被置位了,但是该中断没有被使能,也就是中断使能位值为0,那么外设也不会向PIE控制器提出中断请求
注意:
- 第5点中, 虽然外设不会向PIE控制器提出中断请求,但是相应的中断标志位会一直保持置位状态,直到用程序将其清除为止。当然,在中断标志位保持置位状态时,一旦该中断被使能,那么外设会立即向PIE发出中断请求
- 手动清除外设寄存器中的中断标志位
//清除CPU定时器0中断标志位TIF的语句如下: CpuTimer0Regs.TCR.bit.TIF = 1; //清除定时器中断标志位
总结:
- 外设中断的使能,需要将与该中断相关的外设寄存器中的中断使能位置1
- 外设中断的屏蔽,需要将与该中断相关的外设寄存器中的中断使能位置0
- 外设中断标志位的清除,需要将与该中断相关的外设寄存器中的中断标志位置1
PIE级
步骤:
- 外设中断向PIE提出中断请求
- PIE中断标志寄存器
PIEIFRx
的相关标志位被置位- 若相应的
PIEIERx
相关的中断使能位被置位PIEACK
相应位的值为0,则PIE控制器便会将该外设中断请求提交给CPU- 若相应的
PIEIERx
相关的中断使能位没有被置位 或PIEACK
相应位的值为1,PIE控制器都暂时不会响应外设中断举例:
- CPU定时器0的周期中断被响应了
PIEACK
的第0位(对应于PIE1
,即INT1
)就会被置位,并且一直保持直到手动清除这个标志位- 党CPU在响应
T0INT
的时候,PIEACK
的第0位一直是1,这时如果PIE1
组内发生了其他的外设中断,则暂时不会被PIE控制器响应并发送给CPU- 等到
PIEACK
的第0位被复位之后,若第3步中的中断请求还存在,那么PIE控制器会立即把请求中断发送给CPU注意:
- 将PIE级的中断和外设级的中断相比之后发现,外设中断的中断标志位是需要手动清除的,而PIE级的中断标志位都是自动置位或清除的。但是PIE级多了一个
PIEACK
寄存器,它相当于一个关卡,同一时间只能放一个中断过去,只有等到这个中断被响应完成之后,再给关卡一个放行命令后,才能让同组的下一个中断过去- 每个外设中断被响应之后,一定要对
PIEACK
的相关位进行手动复位,以使得PIE控制器能够响应同组内的其他中断。PieCtrl.PIEACK.bit.ACK1 = 1; //响应PIE组1内的其他中断
总结:
- PIE中断的使能,需要使能某个外设中断,就得将其相应组的使能寄存器
PIEIERx
的相应位进行置位- PIE中断的屏蔽,与上相反
- PIE应答寄存器
PIEACK
相关位的清除,以使得CPU能够响应同组内的其他中断CPU级
步骤:
- 某一个外设中断请求通过PIE发送到CPU
- CPU中断标志寄存器
IFR
中相对应的中断标志位INTx
就会被置位- 该状态就会被锁存在寄存器
IFR
中- CPU不会马上执行相应的中断,而是检查
IER
寄存器中相应位的使能情况和CPU寄存器ST1
全局中断屏蔽位INTM
的使能情况IER
中的相关位被置位,且INTM
的值为0,则中断就会被CPU响应举例:
- CPU定时器0的周期中断
T0INT
发送到CPUIFR
第0位INT1
置位- 当
IER
的第0位INT1
被置位,INTM
的值为0- CPU响应定时器0的周期中断
T0INT
注意:
- CPU接到了中断请求,比发现可以去响应时,就得停止正在执行的程序,转而去响应中断程序,它必须做一些准备工作。
① CPU将相应的IFR
位进行清除,EALLOW
也被清除,INTM
被置位。
② 将正在处理的数据放入堆栈中
然后才会从PIE向量表中取出对应的中断向量ISR,转而去执行中断服务子程序- CPU级中断标志位的置位和清除也都是自动完成
全过程
X2812的中断系统
最新推荐文章于 2023-03-18 11:41:10 发布