一、中断模块寄存器介绍
本节我们主要介绍中断向量汇编文件。为方便说明,程序前面是后加的序号。
1
; Global symbols defined here
2
.global
_intcVectorTable
3
.global
_c_int00
4
.global
_UPP_INT_isr
5
.global
_UART0_isr
6
.global
_GPIO_BANK0_isr
7
.global
_Timer0_isr
8;*******************************************************************
9***********
10;* VEC_ENTRY: Macro that instantiates oneentry in the interrupt service table.
11;******************************************************************
12************
13 VEC_ENTRY
.macro
addr
14 STW B0,*--B15
;
把B0内容保存到*B15,然后指针变量后移,现场保护
15 MVKL addr,B0
;
传入参数的低位地址给B0
16 MVKH addr,B0
;
传入参数的高位地址给B0
17
B
B0
;
程序跳转到B0指向的地址,执行中断向量表
18 LDW *B15++,B0
;
B0
恢复,恢复现场,C6000流水线,跳转后执行多条指令
19
NOP
2;
20
NOP
21
NOP
22
.endm
23;******************************************************************
24************
25;* vec_dummy: Dummy interrupt serviceroutine used to initialize the IST.
26;******************************************************************
27************
28_vec_dummy:
29
B
B3
;
程序跳转到B3指向的地址,其他未定义的中断跳转至B3存储的地址
30
NOP
5
31;******************************************************************
32*********************
33;* Map interrupt service table (IST) tocorresponding interrupt service routines 34(ISR)中断向量表
35;******************************************************************
36*********************
37
.sect
".vecs"
38
.align
1024
;
这块内存的首地址必须能被1024整除
39_intcVectorTable:
40_vector0:
VEC_ENTRY _c_int00
;RESET
41_vector1:
VEC_ENTRY _vec_dummy
;NMI
42_vector2:
VEC_ENTRY _vec_dummy
;RSVD
43_vector3:
VEC_ENTRY _vec_dummy
;RSVD
44_vector4:
VEC_ENTRY _GPIO_BANK0_isr
;DSP Maskable INT4 : Mapped to 45func 'GPIO_BANK0_isr'
46_vector5:
VEC_ENTRY _UPP_INT_isr
;DSP Maskable INT5 : Mapped to func
47'
UPP_INT_isr
'
48_vector6:
VEC_ENTRY _UART0_isr
;DSP Maskable INT6 : Mappedto func'
49UART0_isr
'
50_vector7:
VEC_ENTRY _Timer0_isr
;DSP Maskable INT7 : Mappedto func '
51Timer0_isr
'
52_vector8:
VEC_ENTRY _vec_dummy
;DSP Maskable INT8 : Empty
53_vector9:
VEC_ENTRY _vec_dummy
;DSP Maskable INT9 :Empty
54_vector10:
VEC_ENTRY _vec_dummy
;DSP Maskable INT10:Empty
55_vector11:
VEC_ENTRY _vec_dummy
;DSP Maskable INT11:Empty
56_vector12:
VEC_ENTRY _vec_dummy
;DSP Maskable INT12:Empty
57_vector13:
VEC_ENTRY _vec_dummy
;DSP Maskable INT13:Empty
58_vector14:
VEC_ENTRY _vec_dummy
;DSP Maskable INT14:Empty
59_vector15:
VEC_ENTRY _vec_dummy
;DSP Maskable INT15:Empty
(
1
)下面解释程序中通用命令的原理:
程序中第
13~30
行为
C6000
系列
DSP
中断汇编文件通用写法,已注释意义,这部分相当于完成一个简单的程序跳转功能,在
C64X
平台下,
A0
、
A1
、
A2
、
B0
、
B1
、
B2
作为条件寄存器,但是这个代码不存在条件执行。
程序中
NOP
为控制令,实际作用是填充内存,使指令按字对齐。
.align
1024
保证了后面内存中中断向量表的首地址能被
1024
整除。
(
2
)下面具体介绍如何配置中断向量表:
首先在程序开头定义
.global_intcVectorTable
,中断向量表中定义
_intcVectorTable:,
是为了在主函数中编写
ISTP = (unsignedint)intcVectorTable;
使该寄存器指向中断向量表。
然后配置需要用到的中断,程序开头定义
.global
_GPIO_BANK0_isr,
中断向量表中在需要的中断优先级上定义该做中断
_vector4:
VEC_ENTRY_GPIO_BANK0_isr,
这样就完成了所需中断的配置。不用的中断
_vector10:
VEC_ENTRY_vec_dummy
写这样的关键字。
最后还需要说明的是,别忘了程序开头定义
.global_c_int00,
中断向量表中在最高中断优先级上定义该中断
_vector0: VEC_ENTRY _c_int00
,大家应该都知道
_c_int00
是整个程序的入口,当系统响应
RESET
后,跳转回程序的入口。
#define
DSPINTC_IST_ALL_MASK_INT
0xFFF0
#define
DSPINTC_IST_NMI
(1<< 1)
#define
DSPINTC_IST_INT4
(1 << 4)
void setup_DSP_INTC(void)
{
dspintcRegs->INTMUX1=
CSL_FMK(DSPINTC_INTMUX1_INTSEL4,CSL_INTC_EVENTID_GPIO_B NK0_INT);
//
配置
EVENT
优先级
ISTP = (unsignedint)intcVectorTable;
//
指向中断向量表
ICR =DSPINTC_IST_ALL_MASK_INT;/
/
清空中断
IER = DSPINTC_IST_NMI |DSPINTC_IST_INT4 ;
//
使能中断
_disable_interrupts();
//
禁止中断
}
/*setup_DSP_INTC */
在主程序中
void
main
(
void
)
{
setup_DSP_INTC
();
}
interrupt
void
GPIO_BANK0_isr
(
void
)
//Ping
开始,更新参数,同步中断
{
CSL_FINST(dspintcRegs->
EVTCLR
[
0
],DSPINTC_EVTCLR_EC4,SET);
//
清空中断标志位
;
CSL_FINS(gpioRegs->
BANK
[
0
].
DIR
,GPIO_DIR_DIR0,
0
);
//
输出
CSL_FINS(gpioRegs->
BANK
[
0
].
OUT_DATA
,GPIO_OUT_DATA_OUT0,~(CSL_FEXT(gpioRegs->
BANK
[
0
].
OUT_DATA
,GPIO_OUT_DATA_OUT0)));
//
给出该引脚输出低电平
}
以上程序完成
GPIO
中断配置,中断触发时,相应的
IO
引脚输出低电平。这里再强调一遍,
在中断函数中记得清除中断标志位。