微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > +中断介绍(2)中断向量表配置及说明

+中断介绍(2)中断向量表配置及说明

时间:10-02 整理:3721RD 点击:

一、中断模块寄存器介绍     

       本节我们主要介绍中断向量汇编文件。为方便说明,程序前面是后加的序号。

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 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引脚输出低电平。这里再强调一遍,在中断函数中记得清除中断标志位。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top