定时器中断
利用定时器中断制作方波发生器,通过XF引脚控制LED发光来检测方波的周期
编写中断向量表文件 vectors.asm
表1 TMS320V5410的中断向量表和硬件中断优先权
.sect ".vectors"
.global _c_int00 ; C entry point
.align 0x80 ; must be aligned on page boundary
.global TINT0_ISR
RESET: ; reset vector
BD _c_int00 ; branch to C entry point
STM #200,SP ; stack size of 200
nmi: RETE ; enable interrupts and return from one
NOP
NOP
NOP ;NMI~
; software interrupts
sint17 .space 4*16
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 ;External user interrupt #0
NOP
NOP
NOP
int1: RETE ;External user interrupt #1
NOP
NOP
NOP
int2: RETE ;External user interrupt #2
NOP
NOP
NOP
tint: BD TINT0_ISR ;Timer interrupt
NOP
NOP ;B 指令占两个字,所以要填两个NOP
rint0: RETE ;McBSP #0 receive interrupt (default)
NOP
NOP
NOP
xint0: RETE ;McBSP #0 transmit interrupt (default)
NOP
NOP
NOP
rint2: RETE ;McBSP #2 receive interrupt (default)
NOP
NOP
NOP
xint2: RETE ;McBSP #2 transmit interrupt (default)
NOP
NOP
NOP
int3: RETE ;External user interrupt #3
NOP
NOP
NOP
hint: RETE ;HPI interrupt
NOP
NOP
NOP
rint1: RETE ;McBSP #1 receive interrupt (default)
NOP
NOP
NOP
xint1: RETE ;McBSP #1 transmit interrupt (default)
NOP
NOP
NOP
.space 16*16
.end
技巧提示:(1)第一个中断(Reset 中断)是每个程序都应该有的,在不需要其它中断的情况下,可以只用这一部分,后面全部省掉。
(2)使用的向量一般加一条跳转指令转到相应中断服务子程序,其余空位用NOP 填充;未使用的向量直接用RETE 返回,是为了防止意外进入未用中断。
(3)另外一个重要问题是中断向量表的位置,上电时默认是在FF80H 处,但实际上很多情况下无法把中断向量表加载到FF80 处,一般重定向到0080H,并在程序开头重新设置一下IPTR的值。
K_IPTR .set 0080h ;指向0080H,默认是FF80
LDM PMST,A
AND #7FH,A ;保留低7位,清掉高位
OR #K_IPTR,A ;
STLM A,PMST
要注意的是这段代码要用到累加器A,所以嵌入这段代码的地方必须在用到累加器A 之前。