中断向量表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中断向量表

中断向量表是DSP程序的重要组成部分,当有中断发生并且处于允许状态时,程序指针跳转到中断向量表中对应的中断地址。由于中断服务程序一般较长,通常中断向量表存放的是一个跳转指令,指向实际的中断服务程序。下面是5402中断向量表的一个范例,可以作为模板,使用时稍作修改就行:

*****************************************************************

*5402Vectors.asm

*完整的5402中断向量表示例

*5402共有30个中断向量,每个向量占4个字的空间。

*使用向量一般用一条跳转指令转到相应中断服务子程序,其余空位用NOP填充*未使用的向量直接用RETE返回,是为了防止意外进入未用中断。

***************************************************************** .sect ".vectors" ;开始命名段.vecotrs

.global CodeStart ;引用程序入口的全局符号定义

…;引用其它中断程序入口的全局符号定义

.align 0x80 ;中断向量表必须对齐128字的页边界

RESET: B CodeStart; Reset中断向量,跳转到程序入口NOP ;用NOP填充表中其余空字

NOP ;B指令占了两个字,所以要填两个NOP

NMI: RETE ;不可屏蔽中断

NOP

NOP

NOP

; 软件中断

SINT17 .space 4*16 ;软件中断使用较少,简单起见用0填充

SINT18 .space 4*16

SINT19 .space 4*16

SINT20 .space 4*16

SINT21 .space 4*16

SINT22 .space 4*16

SINT23 .space 4*16

SINT24 .space 4*16

SINT25 .space 4*16

SINT26 .space 4*16

SINT27 .space 4*16

SINT28 .space 4*16

SINT29 .space 4*16

SINT30 .space 4*16

INT0: RETE ;外部中断INT0

NOP

NOP

NOP

INT1: RETE ;外部中断INT1

NOP

NOP

NOP

INT2: RETE ;外部中断INT2

NOP

NOP

NOP

TINT: RETE ;Timer0中断

NOP

NOP

NOP

BRINT0: RETE ;McBSP #0 接收中断

NOP

NOP

NOP

BXINT0: RETE ;McBSP #0 发送中断

NOP

NOP

NOP

DMAC0: RETE ;无定义(默认)DMA0中断NOP

NOP

NOP

TINT1: RETE ;Timer1中断(默认)或DMA1中断. NOP

NOP

NOP

INT3: RETE ;外部中断3

NOP

NOP

NOP

HPINT: RETE ;HPI中断

NOP

NOP

NOP

BRINT1: RETE ;McBSP #1接收中断(默认)或DMA2中断

NOP

NOP

NOP

BXINT1: RETE ;McBSP #1发送中断(默认)或DMA3中断

NOP

NOP

NOP

DMAC4: RETE ;DMA4中断

NOP

NOP

NOP

DMAC5: RETE ;DMA5中断

NOP

NOP

NOP

.end

在本实验中只要把在开头加上中断子程序标号的引用,并在中断表的TINT部分换成跳转指

令就行了:

*vectors.asm for 方波发生

.sect ".vectors" ;开始命名段.vecotrs

.global CodeStart ;引用程序入口的全局符号定义

.global TINT0_ISR ;引用Timer0中断子程序

<节省篇幅,中间省略>

TINT: B TINT0_ISR ;Timer0中断

NOP

NOP

BRINT0: RETE ;McBSP #0 receive interrupt

<节省篇幅,下略>

技巧提示:只有第一个中断(Reset中断)是每个程序都应该有的,在不需要其它中断的情

况下,可以只用这一部分,后面可以省略。如果只需要部分中断也可以按需设置,但必须保

证所用中断在中断向量表的位置不变。不熟悉中断向量表的情况下最好还是用这个完整中断

向量表样例。另外C5400系列中不同型号DSP的中断向量数量和在中断向量表中的位置有

所不同,程序移植时需要查相应datasheet确认。

2.中断向量指针

中断向量表的位置并没有强制的位置,可以在内部存贮器,也可以在外部存贮器。但有一个要求:中断量表必须放在80H字长存贮块的起始处,即中断向量表的首地址的低7位必须全为0。DSP 的寄存器PMST的高9位是中断向量表的指针IPTR。其上电时默认是在FF80H处,这是为了运行固化在内部ROM 的上电加载程序。由于FF80H是只读的,加载用户自定义的中断向量表时会报错。这样需要重新设置IPTR的值,

本书一般把它重定义到0080H(也可以用自定义的地址),并在程序开头重新设置一下IPTR

的值:

改变中断向量表位置

K_IPTR .set 0080h ;指向0080H,默认是FF80

LDM PMST,A

AND #7FH,A ;保留低7位,清掉高位

OR #K_IPTR,A ;将新值传到高9位

STLM A,PMST ;修改PMST寄存器

技巧指示:由于这段代码几乎每个程序都需要,可以单独存成一个文件:

IPTR0080H.asm,然后在程序需要的地方用.copy或.include指令:

.copy “IPTR0080H.asm”

或:.include “IPTR0080H.asm”

编译时就会自动把这段代码嵌到相应位置。稍微要注意的是由于这一小段代码要用到累加器A,所以最好保证执行这段代码之前不要使用累加器A。

其它还有一些经常重复的代码,如初始化SP、DP、IPTR的代码都可以写在一个文件里include/copy进来。

注1:.copy和.inlucde指令效果是一样的,只是在生成程序列表时,.copy会把代码复制过来,而.include不会。

注2:文件名可以用路径,如果不用,则编译器会按下面的循序搜索:当前目录、编译选项指定的目录、环境变量指定的目录。

更多参考:

1.关于中断:SPRU131 TMS320C54x DSP Reference Set, V olume 1: CPU and Peripherals,6.10 Interrupts

2.关于定时器:SPRU131 TMS320C54x DSP Reference Set, V olume 1: CPU and Peripherals,8.4 Timer

外部中断:频率计

DSP有4个外部中断INT0-INT3,下降沿触发,实验箱的频率计使用的是INT3。

频率计的设计原理是:在设定时间下计外部中断INT3的次数,除以定时器的定时周期(也就是乘以定时器中断的触发频率),就得到外部脉冲频率。实验箱上配有1.024k-262.144k共8档频率源,也可以外接频率源。用跳线冒选择频率源,并接到INT3上。下面的例程是定时器定时1s,在INT3中断服务子程序中计脉冲个数,到时则关闭中断。脉冲计数结果显示到数码管上,即为以单位为Hz的频率值

相关文档
最新文档