创龙TMS320C6748开发板———中断介绍(2)中断向量表配置及说明

一、中断模块寄存器介绍      
        本节我们主要介绍中断向量汇编文件。为方便说明,程序前面是后加的序号。
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 引脚输出低电平。这里再强调一遍, 在中断函数中记得清除中断标志位。

你可能感兴趣的:(创龙TMS320C6748开发板———中断介绍(2)中断向量表配置及说明)