今天我们继续上贴的中断系统进行说明,上贴已经说明了中断系统的工作方式以及中断仲裁。今天我们来说明中断的应用。
上贴说过,中断控制单元ICU会对中断节点的中断进行处理,将仲裁胜出的中断对应的信息(包括优先级SRPN、校验ECC、中断节点号SRN index)发送到中断服务者(CPU或者DMA)。相应的中断服务者接受中断后会返还这些信息,这些信息的承载以及中断服务是通过中断服务者的接口来完成的。
那么中断服务者是怎么根据这些信息就可以判断中断类型,并进行相应的中断服务呢?我们知道在51中,每个中断都有相应的地址,触发中断后以该地址为入口进行相应的中断处理。275也是相同的,我们说过在CPU初始化中要初始化中断向量表,该表其实就是中断的入口地址。实际的中断处理,就是将中断处理成中断向量,然后查表都得到中断入口地址进行中断处理。
首先来说明中断服务,我们来看一下中断服务函数的构成:
IFX_INTERRUPT(isr, vectabNum, prio)
该函数是在编译器的C文件中定义的,全都是汇编,大家有空可以研究一下:
我们只关注,该函数的三个参数:ISR表示中断所在的地址:
如图为STM0中断对应的地址空间;vectabNum为向量表号,也就是cpu内核,275有3个内核所以该参数为0、1、2,通常取0即可;prio为优先级,0-255共有256个优先级,可以根据需要自行定义。
我们来看一个中断处理函数:
IFX_INTERRUPT( Ifx_STM0_Isr, 0 , IFX_CFG_ISR_PRIORITY_STM0_COMPARE0)
{
uint32 stmTicks;
stmTicks= (uint32)(stm0CompareValue * 1);
IfxStm_updateCompare(&MODULE_STM0,IfxStm_Comparator_0,IfxStm_getCompare(&MODULE_STM0, IfxStm_Comparator_0) + stmTicks);//更新比较值
timeMicSec[0]++;//记录定时数目
__enable ();//立即使能中断
}
这便是我之前提到过的STM比较中断,三个参数为STM0的中断地址空间、CPU0、以及优先级,这里定义为102.
在回头看一下中断的配置,中断的配置无非是配置SRC寄存器,包括中断优先级、中断服务者选择以及中断使能。其具体流程为:
(1)写入中断优先级,SRC.SRPN;
(2)写入中断服务选择,SRC.TOS;
(3)清除中断标志位,SRC.CLRR=1;
(4)中断使能,SRC.SRE=1;
下面是STM0比较中断的例子:
在该函数的划线部分,完成了中断配置,两个函数的展开如下:
流程和我们说的一致,大家在今后的中断配置可以参考这种方式。今天的内容就先到这里,下一贴我们试试对外部中断进行配置。