TMS320C三大系列的中断系统.docx
《TMS320C三大系列的中断系统.docx》由会员分享,可在线阅读,更多相关《TMS320C三大系列的中断系统.docx(13页珍藏版)》请在冰豆网上搜索。
TMS320C三大系列的中断系统
DSPC2000、C5000、C6000系列的中断系统
专业:
电子与通信工程姓名:
杨攀学号:
201130196006导师:
伍萍辉
摘要:
CPU正处理某件事情(执行程序)时,外部发生了某一事件并向CPU发信号请求去处理,CPU暂时中断当前工作,转去处理这一事件(进入中断服务程序),处理完再回来继续原来的工作。
实现这种功能的部件称为中断系统,产生中断的请求源称为中断源,本文对DSP三大些列芯片的中断系统进行介绍。
Abstract:
TheCPUaredealingwithsomething(theexecutionprocedures),externalhappenedtoaneventandCPUsignalstodealwitharequest,theCPUsuspendedthecurrentwork,turntodealwiththeevents(entertheinterruptserviceroutine),dealwithagaintogobacktotheoriginalwork.Torealizethefunctionofthecomponentiscalledinterruptsystem,andtheresultinginterruptrequestsourcecalledtheinterruptsources,thispaperofDSPthreesomelistedtheinterruptionofthechipintroducessystem.
关键词:
DSP三大系列芯片中断系统
Keywords:
DSPThreeserieschipInterruptsystem
一、TMS320C2000系列中断系统
本文选择2000系列的C28x作为代表芯片对其中断系统进行介绍。
C28x具有包括复位中断向量在内的32个中断向量,它们构成CPU中断向量表。
每个中断向量对应于中断服务子程序ISR入口的22位地址。
当多个中断同时发生时,CPU会按照中断优先级来处理中断,优先级高的先响应,优先级低的后响应。
1中断分类
1.1 可屏蔽中断
C28xCPU的可屏蔽中断包括INT1~INT14、DLOGINT和RTOSINT。
其中,INT1~INT14是普通GPIO中断DLOGINT和RTOSINT中断只在实时仿真时使用。
可屏蔽中断由控制寄存器来控制。
中断标志寄存器(IFR):
每个比特位对应一个可屏蔽中断。
IFR位为1表明有中断等待处理。
中断使能寄存器(IER):
每个比特位对应一个可屏蔽中断。
IER位为1表明相应的中断打开。
CPU调试中断使能寄存器(DBGIER):
功能与IER相同,仅用于实时仿真模式。
全局中断使能位INTM:
ST1寄存器的第1个比特。
当它为0时,全局中断使能开。
在实时仿真模式中,INTM被忽略[1]。
1.2 不可屏蔽的中断
当C28x检测到不可屏蔽中断时,会立即转入相应的中断服务子程序。
不可屏蔽中断包括所有软件中断(INTR、TRAP指令):
执行INTR中断指令时:
相应的IER位会自动清0,而TRAP指令不对IFR或IER产生影响。
硬件中断NMI:
NMI输入管脚的低电平触发。
非法指令中断(Illegal-instructiontrap):
遇到非法的指令操作时触发此中断。
硬件复位中断(RS):
当输入信号RS触发此中断时,CPU寄存器被复位到初始值,然后转入执行相应的复位中断子程序。
2外设中断扩展控制器PIE
C28x系列芯片拥有丰富的片内外设,每个外设根据不同的事件可以产生一个或多个中断请求。
而在CPU层次上,最多可以处理32个中断,因此,如果有更多的中断触发事件,仅依靠CPU已无法处理。
C28x通过外设中断扩展控制器(PIE)增加了可用的中断数目,增强了芯片的中断处理能力。
C28x系列DSP芯片的PIE可以处理多达96个中断。
将PIECTRL寄存器的0比特位置1可以启用PIE模块。
2.1 PIE中断扩展的原理
PIE扩展出的96个中断分为12组,分别对应CPU中断INT1到INT12。
每组8个中断复用成一个CPU中断INTx。
复用过程主要由三个层次的使能来实现。
(1)外设层次。
当外设有中断事件发生时,寄存器中相应的中断标志位(IF)置1。
如果相应的中断使能标志位(IE)是置1的,则此外设向PIE产生一个中断请求信号;若IE为0则保持IF不变,等到IE置1时,外设再向PIE产生中断请求信号。
(2)PIE层次。
96个中断被分为12组,对应12个中断标志寄存器(PIEIFRx)和12个中断使能寄存器(PIEIERx)。
每组8个中断,都有对应的中断标志位PIEIFRx.y和中断使能位PIEIERx.y。
每个PIE中断组都有一个中断接收信号PIEACKx当外设向PIE发出中断请求信号,相应的PIEIFRx.y被置1,如果PIEIERx.y也是1,则PIE会检测相应的PIEACKx,如果PIEACKx是0则PIE向CPU发出中断请求INTx,如果是1,则PIE等到它清零后再向CPU发出中断请求。
如果同一PIE中断组中同时有多个中断发生,则PIE按照组内中断优先级来处理。
(3)CPU层次。
当PIE将中断请求送给CPU后,CPU中相应INTx的标志位IFR被置1,但这个中断要等到满足相应的使能条件才能被CPU响应。
综上,PIE扩展中断数目,其最根本的原理就是增加PIE一级的中断使能和优先级判断。
CPU决定INT1到INT12的中断优先级,PIE决定12组中断中,每8个中断的优先级。
2.2 PIE中断向量表及中断向量表的映射选择DSP芯片运行时,扩展后的PEI中断向量表必须存储在PIERAM中。
PIERAM是SARAM中一个特殊的256×16的存储块,它的起始地址是数据存储空间的0x000D00。
C28x系列DSP芯片有5个可用的中断向量表,到底使用哪个取决于中断向量表映射模式的选择。
控制中断向量表映射的比特位有:
VMAP(状态寄存器ST1的第4个比特位)、M0M1MAP(ST1的第12个比特位)、MP/MC(XINTCNF2寄存器的第9个比特位)、ENPIE(PIECTRL寄存器的第1个比特位)。
对于C28x的芯片M0、M1模式是保留不用的模式,BROM模式只在测试时才用到,实际应用中都使用PIE映射模式(UMAP=1且ENPIE=1)。
2、TMS320C5000系列中断系统
本文选择5000系列的C54x作为代表芯片对其中断系统进行介绍。
1、C54xDSP的中断可以分成如下两大类:
第一类是可屏蔽中断。
这些都是可以用软件来屏蔽或用软件来使能的硬件和软件中断源。
C54xDSP最多可以支持16个用户可屏蔽中断。
第二类是不可屏蔽中断,这些中断是不能够屏蔽的。
C54xDSP总是响应这一类中断。
C54xDSP的非屏蔽中断包括所有的软件中断与和两个外部硬件中断,这两个中断可通过硬件控制也可通过软件控制。
复位中断对C54xDSP所有操作
方式产生影响,而中断不会对C54xDSP的任何操作模式产生影响。
但中断被声明时,禁止所有其他中断。
2、中断标志寄存器(IFR)和中断屏蔽寄存器(IMR)
中断标志寄存器和中断屏蔽寄存器都是存储器映射的CPU寄存器。
IFR对各硬件中断进行标志,当一个中断触发时,IFR中的相应的中断标志位置1,直到CPU识别该中断为止。
IMR对各硬件中断进行屏蔽或使能,某位为0表示此中断被屏蔽(禁止),某位为1表示此中断使能(以状态寄存器INTM位为0为前提条件)。
对IFR来说,某位为1表示DSP收到了一个相应的中断请求,用软件将IFR某位置1,等效于DSP收到了一个中断请求。
通常在开始某中断前,都将IFR对应位中记录的过期中断标志清0[2]。
3、中断响应过程
1.接收中断请求
一个中断由硬件器件或软件指令请求。
当产生一个中断请求时,IFR寄存器中相应的中断标志位被置位。
不管中断是否被处理器应答,该标志位都会被置位。
当相应的中断被响应后,该标志位自动被清除。
1)硬件中断请求
外部硬件中断由外部中断口的信号发出请求,而内部硬件中断由片内外设的信号发出中断请求。
2)软件中断请求
软件中断由如下程序指令发出中断请求:
(1)INTR该指令允许执行任何一个中断服务程序。
指令操作数(K)表示CPU分支转移到哪个中断向量地址。
表3.1~3.6列出了用于指向每个中断向量位置的操作数K。
当应答INTR中断时,ST1寄存器的中断模式位(INTM)被设置为1以禁止可屏蔽中断。
(2)TRAP该指令执行的功能与INTR指令一致,但不用设置INTM位。
(3)RESET该指令执行一个非屏蔽软件复位,可以在任何时候被使用并将C54xDSP置于已知状态。
RESET指令影响ST0和ST1寄存器,但是不会影响PMST寄存器。
当应答RESET指令时,INTM位被调协为1以禁止可屏蔽中断。
IPTR和外设寄存器的初始化与硬件复位的初始化是不同的。
4.应答中断
硬件或软件中断发送了一个中断请求后,CPU必须决定是否应答该中断请求。
软件中断和非屏蔽硬件中断会立刻被应答,可屏蔽中断仅仅在如下条件满足后才被应答。
1)最高优先级
当超过一个硬件中断同时被请求时,C54xDSP按照中断优先级响应中断请求。
2)INTM位清0
ST1的中断模式位(INTM)使能或禁止所有可屏蔽中断。
(1)当INTM=0,所有非屏蔽中断被使能。
(2)当INTM=1,所有非屏蔽中断被禁止。
当响应一个中断后,INTM位被置1。
如果程序使用RETE指令退出中断服务程序(ISR)后,从中断返回后INTM重新使能。
使用硬件复位或执行RSBXINTM指令(禁止中断)会将
INTM位置1。
通过执行BSBXINTM指令(使能中断),可以复位INTM位。
INTM不会自动修改IMR或IFR。
(3)IMR屏蔽位为1
每个可屏蔽中断在IMR中有自己的屏蔽位。
为了使能一个中断,可以将屏蔽位置1。
INTR指令会强制PC到相应地址,并且获取软件向量。
当CPU读取软件向量的第一个字时,它会产生(中断应答信号)信号,而清除相应的中断标志位。
对于被使能的中断,当产生(中断应答信号)信号时,在CLKOUT的上升沿,地址位A6~A2会指明中断号。
如果中断向量驻留在片内存储器,并且用户想查看这些地址,C54xDSP必须在地址可见模式下工作(AVIS=1),以便中断号被译码。
如果当C54xDSP处于Hold模式并且HM=0时,则会产生一个中断。
当信号有效时,地址不可见[3]。
5.执行中断服务程序
当应答中断后,CPU会采取如下的操作:
(1)保存程序计数器(PC)值(返回地址)到数据存储器的堆栈顶部。
程序计数器扩展寄存器(XPC)不会压入堆栈的顶部,也就是说,它不会保存在堆栈中。
因此,如果ISR位于和中断向量表不同的页面,用户必须在分支转移到ISR之前压入XPC到堆栈中。
FRET[E]指令可以从ISR返回。
(2)将中断向量的地址加载到PC。
(3)获取位于向量地址的指令(分支转移被延时,并且用户也存储了一个2字指令或两个1字指令,则CPU也会获取这两个字)。
(4)执行分支转移,转到中断服务程序(ISR)地址(如果分支转移被延时,则在分支转移之前会执行额外的指令)。
(5)执行ISR,直到一个返回指令中止ISR。
(6)将返回地址从堆栈中弹出到PC中。
(7)继续执行主程序。
根据中断请求源的两种不同类型,分别描述其中断操作流程:
(1)如果请求的是一个可屏蔽中断,则操作过程如下:
①设置IFR的相应标志位。
②测试应答条件(INTM=0并且相应的IMR=1)。
如果条件
为真,则CPU应答该中断,产生一个(中断应答信号)信号;
否则,忽略该中断并继续执行主程序。
③当中断已被应答后,IFR相应的标志位被清除,并且
INTM位被置1(屏蔽其他可屏蔽中断)。
④PC值保存到堆栈中。
⑤CPU分支转移到中断服务程序(ISR)并执行ISR。
⑥ISR由返回指令结束,返回指令将返回地址从堆栈中弹出给PC。
⑦CPU继续执行主程序。
(2)如果请求的是一个非屏蔽中断,则操作过程如下:
①CPU立刻应答该中断,产生一个(中断应答信号)信号。
②如果中断是INTR指令请求的,则INTM位被置1(屏蔽其他可屏蔽中断)。
③如果INTR指令已经请求了一个可屏蔽中断,那么相应标志位被清除为0。
④PC值保存到堆栈中。
⑤CPU分支转移到中断服务程序(ISR)并执行ISR。
⑥ISR由返回指令结束,返回指令将返回地址从堆栈中弹出给PC。
⑦CPU继续执行主程序。
6.重新映射中断向量地址
中断向量可以映射到程序存储器的任何128字页面的起始位置,除保留区域外。
中断向量地址是由PMST寄存器中的IPTR(9位中断向量指针)和左移两位后的中断向量序号(中断向量序号为0~31,左移两位后变成7位)所组成。
例如,如果被声明为低优先级,并且IPTR=0001h,则中断向量的地址为00C0h,中断向量号为16。
复位时,IPTR所有的位被置1(IPTR=1FFh),并按此值将复
位向量映射到程序存储器的511页空间。
所以,硬件复位后总是从0FF80h开始执行程序。
加载除1FFh之外的值到IPTR后,中断向量可以映射到其他地址。
例如,用0001h加载IPTR,那么中断向量就被移到从0080h单元开始的程序存储器空间。
注意:
硬件复位向量不能被重新映射,因为硬件复位会加载1到IPTR所有的位,因此,硬件复位向量总是指向程序空间的FF80h位置。
三、TMS320C6000的中断系统
C6000的中断可以分为3类:
1.RESET
2.非屏蔽中断
3.可屏蔽中断
RESET是优先级最高的中断,它连接到外部的RESET/管脚,非屏蔽中断NMI为第二优先级的中断,它对应外部的NMI管脚。
INT4-INT15为较低优先级的中断(INT15为最低)[4]。
1.RESET
复位是最高优先级的中断,用来将CPU返回到固定的状态复位是一个低有效信号,所有别的中断信号是高有效。
为了使CPU正确的初始化,复位低电平必须保持10个时钟周期。
正在执行的指令停止,寄存器回到默认状态复位的ISFP必须在地址“0”。
2.NMI非屏蔽中断
要使能NMI中断,需将IER中的NMIE位置“1”,跳转的延迟等待会阻止NMI中断的进程。
复位时NMIE被清“0”,当NMI产生时,NMIE被清“0”,手动无法清除NMIE,但可以设置NMIE来允许中断嵌套。
3.可屏蔽中断(INT4-INT15)
可屏蔽中断产生的条件:
控制状态寄存器CSR中的全局中断使能位GIE设为“1”中断使能寄存器IER中的NMIE位设为“1”IER中对应的中断使能位置为“1”。
4.中断响应和中断号
中断响应IACK表明CPU开始执行一个中断,中断号INUMn表明所执行的是几号中断。
5.中断服务表IST
当CPU执行一个中断时,它参考中断服务表,中断服务表里包含中断服务程序的指令包。
每个中断服务取指包(ISFP)包含8条指令。
5.中断控制寄存器列表:
表1中断控制寄存器列表
5.1控制状态寄存器:
表2控制状态寄存器
GIE为可屏蔽中断使能:
GIE=0,所有的可屏蔽中断禁止;
GIE=1,所有的可屏蔽中断使能;
5.2中断清除寄存器:
表3中断清除寄存器
向相应的位写1可手动清除IFR寄存器中的相应位,使可屏蔽中断清除。
5.4中断使能寄存器:
表4中断使能寄存器
NMIE位为所有的非复位中断(NMI和INT4-INT15)使能位
NMIE=0,禁止所有非复位中断;
NMIE=1,使能所有非复位中断。
IE4-IE15对应INT4-INT15,该为置1时使能相应的中断,置0时禁止相应中断。
5.5中断标志寄存器:
表5中断标志寄存器
相应位为1表明有相应的中断产生[5]。
5.6中断设置寄存器ISR:
表6中断设置寄存器ISR
手动设置向相应的位置1可使IFR中相应位为1。
6.中断的检测和执行
下图说明了中断产生的过程,CPU时钟周期1在外部中断管脚产生了一个上升沿,两个时钟周期后到达CPU的边界,中断信号进入CPU后在时钟周期4被检测,检测后两个周期(时钟周期6)置中断标志寄存器。
执行一个非复位中断的条件:
1)IFm在CPU时钟6被设置位“1”(处理器的中断逻辑自己设置);
2)IFR中没有更高优先级的中断被置“1”;
3)IER中相应的位应被设为“1”(用户在程序中设置);
4)CSR中的GIE被设为“1”(用户在程序中设置);
5)IER中的NMIE位被设为“1”(用户在程序中设置);
6)前5个(N到N+4)执行包中不包含跳转和不在跳转的Delayslots中。
执行非复位中断的过程:
1)其他非复位中断的进程被禁止
2)对所有的可屏蔽中断,GIE中的值被拷贝到PGIE中,然后GIE被清零;
3)对于NMI,NMIE被清零;
4)下一个(从N+5)执行包被取消,如果一个执行包在流水线的特定阶段被取消,它不会改变CPU的任何状态,这个取消操作也迫使该指令在将来的流水线阶段被取消。
5)在时钟周期7IACK被产生,特定的INUM值用来表明那个中断正在被执行;
6)IFm在时钟周期8被清除;
7)时钟周期9跳转到ISTP中所指的地址,即中断向量表所放的位置。
7.中断嵌套
通常情况下,执行一个可屏蔽中断服务子程序时,其他可屏蔽中断是被禁止的。
而这时,NMI是可以被响应的。
即通常情况下可屏蔽中断之间是不能互相嵌套的。
如果要实现中断的嵌套,需要在软件里进行操作:
1)保存IRP
2)保存PGIE
3)GIE位被设为“1”
8.TMS320C54XDSP的中断编程中应该注意的问题
8.1中断运行机制
C54系列的中断向量表占用连续128B空间,每个中断向量占用连续4B空间,因此每个中断向量的地址构成方式为:
PC=(IPTR)<<7+(Vector[n])<<2,Vector[n]为中断向量号,取值于区间[031]的整数。
中断向量表总是以汇编的形式出现。
当DSP接收到一个中断时(接收中断请求),如果是软件中断或者可屏蔽中断已开(中断确认),将暂停正在执行的程序转而运行中断向量程序,即在中断向量表中查找中断服务程序的入口地址,查到后便进入中断服务程序的运行(执行中断服务程序),运行完成后再回到主程序中继续先前的程序运行。
因此,中断程序的编写便包括三个方面:
中断产生和开启;中断服务程序;中断向量程序。
其中,最关键的问题是中断向量表程序的编写和内存定位。
当硬件复位时,IPTR=1FFH,表示中断向量表就放在以0FF80H(默认)为起始地址的连续128B空间,DSP可从中断向量表进入并执行复位中断服务程序,即进入项目主程序。
可见,DSP将Reset作为一个中断,从而完成了主程序的启动(或重新启动)。
在主程序中修改IPTR值可以重新映射中断向量表,主程序运行之后便将中断向量表放至方便查找的位置。
中断向量表的内容由中断向量构成,每一个中断向量存放着与之对应的中断服务程序的入口地址。
采用定时器中断产生一个方波。
该中断系统的设计包括:
中断服务程序;中断向量表;主程序;内存配置程序。
中断服务程序编写:
_TINT0_ISR:
PSHMST0
BANZNext,*Counter-
STM#CounterSet,Counter
BITF*AR2,#1
BCResetXF,TC
setXF:
SSBXXF
ST#1,*AR2
BNext
ResetXF:
RSBXXF
ST#0,*AR2
Next:
POPMST0
MVDK*AR2,y
ADDM#0H,y
NOP
NOP
RETE
在定时器中断服务程序的开始处使用标号,该标号可以看作是该中断服务程序的名字,即
“_TINT0_ISR”。
8.2建立中断向量表
8.2.1中断向量程序
中断向量表的建立主要涉及几个关键技术:
(1)引用中断服务程序标号,如“.ref_TINT0_ISR”。
(2)引用其他在中断向量程序中使用的程序标号,如“.ref_c_int00”“.ref__ret”。
(3)在中断服务程序开始处定义一个中断服务程序标号,并定义为一个变量,如“.globalvector”。
用于主程序修改IPTR(中断向量指针寄存器)的值,指向中断向量表的新位置,实现中断向量表的重新定位。
从而可得中断向量表程序。
.mmregs
.ref__ret
.ref_c_int00
.ref_TINT0_ISR
.globalvector
.sect″.int_table″
vector:
rsb_c_int00
nop
nop
nmib_ret
nop
nop
sint17.space4*16
sint18.space4*16
sint19.space4*16
sint20.space4*16
sint21.space4*16
sint22.space4*16
sint23.space4*16
sint24.space4*16
sint25.space4*16
sint26.space4*16
sint27.space4*16
8.2.2生成中断向量表
中断向量表有两种内存定位方案:
(1)在中断向量程序中使用伪指令“.align0x80”,CCS自动将中断向量表分配至整页,但程序员不清楚中断向量表的具体地址。
(2)在中断向量程序开始处,将中断向量表定义为已命名段,如“.sect‘.int_vector’”;然后,在配置文件中将该已命名段放至指定地址(二进制的低7位必须为零),程序员清楚中断向量表的具体地址。
MEMORY{
PAGE0:
VEC:
origin=0x1C00,length=0x0080
PROG:
origin=0x1C80,length=0x1000
PAGE1:
DATA:
origin=0x0060,length=0x0060
STACK:
origin=0x00C0,length=0x0400
}
SECTIONS{
.int_table:
{}>VECPAGE0
.text:
{}>PROGPAGE0
.data:
{}>PROGPAGE0
.bss:
{}>DATAPAGE1
.stack:
{}>STACKPAGE1
}
8.3主程序编写
主程序的编写包括多项关键技术:
(1)首先定义中断服务程序的标号为全局变量,以备中断服务程序使用,如“.def_TINT0_ISR”。
(2)定义中断服务程序中用到的标号或变量。
如“.def_c_int00”“.def__ret”。
(3)修改IPTR值,使其指向中断服务程序的入口地址处。
(4)屏蔽所有中断,设置相关中断,然后使能相关中断,开启全局中断。
参考文献:
[1]汪安明