DSP讲义105精.docx
《DSP讲义105精.docx》由会员分享,可在线阅读,更多相关《DSP讲义105精.docx(15页珍藏版)》请在冰豆网上搜索。
DSP讲义105精
第五讲TMS320C54x中断系统中断系统是计算机系统中提供实时操作及多任务多进程操作的关键部分。
(PC多核CPU)’C54x的中断系统根据芯片型号的不同,共有24~27个软件及硬件中断源,分为11~14个中断优先级,可以实现多层任务嵌套。
对于可屏蔽中断,用户可以通过软件实现中断的关断或开启。
第五讲TMS320C54x中断系统
5.1中断请求
’C54x的中断请求源按CPU的控制级别分为两大类。
生,CPU’C54x中这类中断共有16个,其中两个可以通过硬件控制,其余14个只能通过软件控制。
两个可以通过硬件控制的不可屏蔽中断分别是中断优先级最高(1级)的复位中断/RS,以及优先级为2的NMI。
前者对芯片的所有操作产生影响,后者,不会对任何CPU的现行操作产生影响,但是会禁止其他中断的响应。
同时,这两个中断也可以通过软件控制。
因此,在’C54x中的16个不可屏蔽中断中.优先级分为两级:
复位中断/RS为1级,其余中断的全部为2级。
第五讲TMS320C54x中断系统
5.1中断请求
第二,可屏蔽中断:
这一类中断是可以通过软件屏蔽或开放的硬件或软件中断。
‘C54x最多可以支持16个可屏蔽中断,这些中断全部可以通过软件或者硬件对它们进行初始化或控制。
这里的软件中断是指利用程序指令,例如INTR、TRAP、RESET等进行中断触发。
硬件中断有两种形式:
一是由片外信号触发的外部硬件中断;二是片内外设触发的内部硬件中断。
(MCU的测频、测周期)
第五讲TMS320C54x中断系统
第五讲TMS320C54x中断系统
5.1中断请求
中断请求源分别由芯片内部的
中断标志寄存器IFR和中断屏蔽寄存器IMR的对应位表示并锁存。
中断标志寄存器是一个存储器映像寄存器,当某个中断触发时,寄存器的相应位置1,直到中断处理完毕为止。
第五讲TMS320C54x中断系统
5.2中断控制
中断控制主要是屏蔽某些中断,避免其他中断对当前运行程序的干扰,以及防止同级中断之间的响应竞争。
(1)中断屏蔽
’C54x的CPU对中断源的开放和屏蔽,由片内存储器映像寄存器IMR控制。
IMR的内存地址为0H。
IMR各位的意义如图所示。
将IMR的某位置1,则相应的中断放开。
只对可屏蔽中断有效。
第五讲TMS320C54x中断系统
5.2中断控制
(2)中断优先级
’C54x有14个固定中断优先级,当执行优先级低的中断时,可以被优先级高的中断打断,也可以通过对中断屏蔽寄存器IMR编程,屏蔽高级中断的干扰。
但是,当执行高级中断时,低级中断是无法响应的。
因此,’C54x中断的优先级编程余地不大,可以按照软件设计要求尽量按照器件设定的优先级组织中断系统。
另外,不可屏蔽中断共有15个,当其中一个中断触发时,其他中断全部被屏蔽,所以,不会发生中断冲突。
5.2
中断控制(3)中断响应过程
对于软件中断和不可屏蔽中断,CPU立即响应。
对于硬件可屏蔽中断必须满足以下条件,CPU才能够响应中断:
(1)出现多个中断时,此中断的优先级别最高;
(2)ST1中的INTM位为0,允许全局中断;
(3)IMR中的响应相应位为1,开放此中断。
满足上述条件,CPU响应中断,终止当前正在进行的操作,指令计数器PC自动转向相应的中断向量地址,取出中断服务程序地址,并发出硬件中断响应信号/IACK,清除相应的中断标志位。
5.2
中断控制
5.2中断控制
执行中断服务程序前,必须将中断程序中用到的寄存器全部保存到堆栈中去,执行完中断服务程序,返回时应该按压栈相反的顺序依次恢复寄存器内容。
‘C54x中,中断向量地址由PMST中的9位中断向量地址指针IPTR和左移2位后的中断向量序号组成。
例如:
INT0=00010000B=10H,左移2位变成1000000B=40H,IPTR=0001H,则中断向量地址为0000000011000000H=00C0H,如图所示。
5.2中断控制
执行中断服务程序前,必须将中断程序中用到的寄存器
5.2
中断控制
复位时,IPTR=1FFH,因此,程序地址总是
5.2
中断控制复位时,IPTR=1FFH,因此,程序地址总是PC=1111111110000000B=0FF80H,
5.2中断控制
复位时,IPTR=1FFH,因此,程序地址总是PC=1111111110000000B=0FF80H,而且,硬件复位地址是固定不变的,
其他中断向量可以通过改变IPTR的内容重新安排中断程序的地址。
例如:
IPTR=001H,中断向量移至0080H开始的程序存储空间。
第五讲TMS320C54x中断系统
5.3外部中断触发
外部中断触发方式有两种,电平触发和边沿触发。
电平触发方式:
是指外部的硬件中断源产生中断用电平表示。
例如,高电平表示中断申请,CPU可以通过采集硬件信号电平响应中断信息。
但此种触发方式要求在中断服务程序返回之前,外部中断请求输入必须无效,否则,CPU会反复中断。
因此,在这种触发方式下,CPU必须有应答硬件信号通知外部中断源,当中断处理完成后,取消中断申请。
边沿触发方式:
这种方式下,外部中断申请触发器能锁存外部中断输入线上的负跳变。
即使CPU不能及时响应中断,中断申请标志也不丢失。
但是,输入脉冲宽度至少保持3个时钟周期,才能被CPU采样到。
外部中断的边沿触发方式适用于以负脉冲方式输入的外部请求源。
第五讲TMS320C54x中断系统
5.4中断系统应用
如果系统有多个外部中断源,首先按这些中断源的时间响应要求的轻重缓急进行排队,按规定中断源的优先级顺序连接到系统中去。
但是,’C54x系列的外部中断引脚只有4个,为了扩展外部中断源的个数,可以用”或”的方法将多个中断源连接到中断源引脚上,同时各个中断源连接到I/O口上,中断产生后,读I/O判断是哪个中断源申请中断。
这种方法原则上可以处理任意多个同优先级的中断源,也可以利用软件对I/O口的中断源优先级编程。
但实际上具体芯片可以扩展的中断源个数由系统的可用I/O个数限定。
第五讲TMS320C54x中断系统
5.4中断系统应用
【例】有8个外部中断源,分别表示为IR1,IR2,…,IR8,各中断源是边沿触发方式,试用’C5402
建立相应的中断系统
第五讲TMS320C54x中断系统
5.4中断系统应用
【例】有8个外部中断源,分别表示为IR1,IR2,…,IR8,各中断源是边沿触发方式,试用,C5402建立相应的中断系统。
方法:
每2个一组相“与”后,分别接入四个外部中断接口INT0、INT1、INT2、INT3。
每组分别将2条线,分别接于HPI端口,此时,HPI端口作为I/O
口用。
第五讲TMS320C54x中断系统
5.4中断系统应用
【例】有8个外部中断源,分别表示为IR1,IR2,…,IR8,各中断源是边沿触发方式,试用,C5402建立相应的中断系统
第五讲TMS320C54x中断系统
5.4中断系统应用
由INT0、INT1、INT2、INT3的中断优先级顺序可知,前面的中断扩展出来的中断源高于后面的.又由于软件中先查询的中断比后查询的有更高的优先级,可以得知扩展后的8个中断的优先级顺序由高至低依次为IR1、IR2、IR3、IR4、IR5、IR6、IR7、IR8。
第五讲TMS320C54x中断系统
5.4中断系统应用
扩展的外部中断源,使用时应注意如下问题:
(1)中断响应时间:
’C54x的外部中断响应时间比较长。
因为,CPU在为实际的中断源服务之前需要执行一段引导程序,因此,对扩展的中断源而言,实际的中断响应时间一定要把引导程序的时间计入在内。
(2)中断申请信号宽度,扩展的外部中断源,其中断申请信号应采用负脉冲形式,且负脉冲要求有一定的宽度,这与引导程序的执行时间有关。
(3)堆栈深度,因为中断源的增多,会使压栈、弹栈的操作频繁,因此,堆栈的大小一定要慎重考虑,否则,会出现运行错误,造成程序混乱。
BD_c_int00;branchtoCentrypointSTM#200,SP;stacksizeof200
nmi:
RETE;enableinterruptsandreturnfromone
NOP
NOP
NOP;NMI~
5.2
中断控制
复位时,IPTR=1FFH,因此,程序地址总是PC=1111111110000000B=0FF80H,
第五讲TMS320C54x中断系统
5.4中断系统应用
5402最小系统板
vectors.asm.sect".vectors"
.ref_myint1
.ref_mytimer0
NOP
NOP
NOP;NMI~
第五讲TMS320C54x中断系统
5.4中断系统应用
5402最小系统板
vectors.asm
.sect".vectors"
.ref_myint1
.ref_mytimer0
.ref_c_int00;Centrypoint
.align0x80;mustbealignedonpageboundaryRESET:
;resetvector
BD_c_int00;branchtoCentrypointSTM#200,SP;stacksizeof200
nmi:
RETE;enableinterruptsandreturnfromone
NOP
NOP
NOP;NMI~
;softwareinterruptssint17.space4*16sint18.space4*16sint19.space4*16sint20.space4*16sint21.space4*16sint22.space4*16sint23.space4*16sint24.space4*16sint25.space4*16sint26.space4*16sint27.space4*16sint28.space4*16sint29.space4*16sint30.space4*16
int0:
RETE
NOP
NOP
NOP
int1:
B_myint1
NOP
RETE
int2:
RETE
NOP
NOP
NOP
tint:
B_mytimer0
NOP
RETE
rint0:
RETE
NOP
NOP
NOP
xint0:
RETE
NOP
NOPNOP
rint1:
RETE
NOPNOPNOPxint1:
RETE
NOPNOPNOPint3:
RETE
NOPNOPNOP.end
vectors.asm
.ref_mytimer0
sint25.space4*16sint26.space4*16sint27.space4*16sint28.space4*16sint29.space4*16sint30.space4*16rint0:
RETE
NOPNOPNOP
xint0:
RETE
RESET:
BD_c_int00STM#200,SPnmi:
RETE
NOPNOPNOP
;softwareinterruptssint17.space4*16sint18.space4*16sint19.space4*16sint20.space4*16sint21.space4*16sint22.space4*16sint23.space4*16
sint24.space4*16
int0:
RETE
NOPNOPNOP
int1:
B_myint1
NOPRETE
int2:
RETE
NOPNOPNOP
tint:
B_mytimer0
NOPRETE
NOPNOPNOPrint1:
RETE
NOPNOPNOP
xint1:
RETE
NOPNOPNOP
int3:
RETE
NOPNOPNOP.end
vectors.asm
.ref_mytimer0
NOPNOPNOP
;softwareinterruptssint17.space4*16sint18.space4*16sint19.space4*16
sint20.space4*16
sint21.space4*16sint22.space4*16
sint23.space4*16
sint24.space4*16
vectors.asm
.sect".vectors".ref_myint1.ref_mytimer0
.ref_c_int00.align0x80
sint25.space4*16sint26.space4*16sint27.space4*16sint28.space4*16sint29.space4*16sint30.space4*16rint0:
RETE
NOPNOPNOP
xint0:
RETE
RESET:
BD_c_int00STM#200,SPnmi:
RETE
NOPNOPNOP
;softwareinterruptssint17.space4*16sint18.space4*16sint19.space4*16sint20.space4*16sint21.space4*16sint22.space4*16sint23.space4*16
sint24.space4*16
int0:
RETE
NOPNOPNOP
int1:
B_myint1
NOPRETE
int2:
RETE
NOPNOPNOP
tint:
B_mytimer0
NOPRETE
NOPNOPNOPrint1:
RETE
NOPNOPNOP
xint1:
RETE
NOPNOPNOP
int3:
RETE
NOPNOPNOP.end