这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » C6000 DSP系统中断过程解析

共1条 1/1 1 跳转至

C6000 DSP系统中断过程解析

助工
2014-12-18 19:35:26     打赏

1.  中断相关概念 
中断过程-----------------------------------你在下象棋,突然电话响了,你回屋接电话,然
后回来继续下象棋,这个过程就叫做中断响应过程。 
CPU执行正常任务---------------------下象棋 
保护现场----------------------------------你已经想好要“将军”,先在脑海中记下来。 
中断发生----------------------------------电话响- 
中断服务程序----------------------------接电话 
恢复现场----------------------------------回来后恢复刚才想法 
中断返回----------------------------------你回来继续下象棋 
中断屏蔽----------------------------------Boss 正在训话,要求所有电话关机,你不能接电话
了。 
非屏蔽中断—----------------------------你内急,即使是 Boss 在训话,你还是得到外面去
嘘嘘。 
      可屏蔽中断-------------------------------你在“闭关修炼”,可以不受外界干扰。 
 
2.  中断源 
C6000 支持软件中断和硬件中断。软件中断由指令产生中断请求,硬件中断可以来自
外设的一个请求信号,如外部中断。C620x/C670x 中断向量表 
 


 


中断号  中断名称    中断功能


00000b    DSPINT      Host port host to DSP interrupt


00001b    TINT0        Timer 0 interrupt


00010b    TINT1        Timer 1 interrupt


00011b    SD_INT      EMIF SDRAM timer interrupt


00100b    EXT_INT4     External interrupt 4


00101b    EXT_INT5     External interrupt 5


00110b    EXT_INT6     External interrupt 6


00111b    EXT_INT7     External interrupt 7


01000b    EDMA_INT    EDMA channel (0 through 15) interrupt


01001b    Reserved Not used


01010b    Reserved Not used


01011b    Reserved Not used


01100b    XINT0        McBSP 0 transmit interrupt


01101b    RINT0        McBSP 0 receive interrupt


01110b    XINT1        McBSP 1 transmit interrupt


01111b    RINT1        McBSP 1 receive interrupt


Other   Reserved


不同型号的 DSP 定义中断号所对应的中断功能不同,为了达到统一使用中断号功能,
DSP 可以使用中断复用寄存器进行重新映射。通过中断复用寄存器映射可以把中断源映射
到任何 CPU中断。 
 
中断复用寄存器默认中断号映射表 
 






CPU


Related


INTSEL


Interrupt


 


Interrupt


INTSEL field


Reset Value


Acronym


Interrupt Deion


INT4


INTSEL4


00100b


EXT_INT4


External interrupt pin 4


INT5


INTSEL5


00101b


EXT_INT5


External interrupt pin 5


INT6


INTSEL6


00110b


EXT_INT6


External interrupt pin 6


INT7


INTSEL7


00111b


EXT_INT7


External interrupt pin 7


INT8


INTSEL8


01000b


DMA_INT0/


DMA Channel 0 Interrupt/


 


 


 


EDMA_INT


EDMA interrupt


INT9


INTSEL9


01001b


DMA_INT1


DMA Channel 1 interrupt†‡


INT10


INTSEL10


00011b


SD_INT


EMIF SDRAM timer interrupt


 


 


 


 


(C62x/C67x)


 


 


 


SD_INTA


EMIFA SDRAM timer interrupt


 


 


 


 


(C64x)


INT11


INTSEL11


01010b


DMA_INT2


DMA Channel 2 interrupt†‡


INT12


INTSEL12


01011b


DMA_INT3


DMA Channel 3 interrupt†‡


INT13


INTSEL13


00000b


DSPINT


Host port to DSP interrupt


INT14


INTSEL14


00001b


TINT0


Timer 0 interrupt


INT15


INTSEL15


00010b


TINT1


Timer 1 interrupt




3.  常用中断寄存器 
通过对中断寄存器进行配置,可以实现各种中断功能。 
IER(中断使能寄存器) 
IFR(中断标志寄存器) 
ISR(中断设置寄存器) 
ICR(中断清除寄存器) 
ISTP(中断向量表起始地址寄存器)中断向量程序的地址可以通过 ISTP寄存器进行重新映
射 
MUXH(中断复用寄存器) 
MUXL(中断复用寄存器) 
通过 DSP data sheet 可以很容易找到寄存器的绝对地址,但为了减少配置错误和方便移
植,在编程时一般采用 CSL 函数对中断寄存进行配置。 


4.  CSL(DSP API 函数)函数使用说明 
在开发 DSP 的过程中一定要用好 CSL 函数,它给 DSP 的编程带来很多方便。使用 CSL
函数可以使程序更容易理解和维护,同时可以有效避免在编程中的笔误。 
 
IRQ_clear(IRQ_EVT_TINT0);//对 IFR寄存器进行操作,定时中断标志位清零 
IRQ_enable(IRQ_EVT_TINT0;//对 IER寄存器进行操作,使能定时中断 
IRQ_map(IRQ_EVT_TINT0,12);//对 MUX 寄存器进行配置,根据需要把中断号进行重新映
射。 
IRQ_globalEnable();//对CSR 中 GIE 标志位进行配置,标志位置 1; 
。。。。。。。。。。。。。 
 
相应的 CSL函数可以在 CCS自带的PDF 文档《TMS320C6000Chip Support Library API 
Reference Guide》中进行查找 
 
5.  中断响应流程图 
 
  
 


6.  中断过程描述 
 
1.  上电复位,产生复位中断请求,上电中断无需确认,直接执行。 
2.  STW    B0,*--B15;  进行现场保护 
3.  MVKL  addr,B0; 
MVKH  addr,B0;载入中断向量表,将中断向量表送入程序指针。 
4.  B      B0;跳转至 B0 中存储的地址,执行中断向量表。 
5.  执行_c_int00 进行初始化 
6.  跳转至 main()执行 csl 函数,IO口,定时器等初始化。 
7.  执行 while 循环。 
8.  定时时间到,产生定时中断。 
9.  重复执行 2-4步骤 
10.  执行中断服务程序 c_int14。 
11.  中断返回 
12.  LDW    *B15++,B0  恢复现场。 
13.  继续执行 while 循环。 
 
7.  中断程序解析 
void main() 

            
           CSL_init();//CSL函数初始化 
 
           Htimer = TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);//打开定时器 0,返回定
时器句柄 
           TimerEventId = TIMER_getEventId(Htimer);//取得定时事件 ID 
           TIMER_config(Htimer,&Mtimer_configA);//配置定时器 
 
           Hgpio  = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);//打开 IO 
           GPIO_config(Hgpio,&Mgpio_config);//配置 IO 
 
           IRQ_setVecs(vectors);//重新设置中断向量, 
           IRQ_globalEnable();//全局中断使能 
           IRQ_nmiEnable();  
           IRQ_map(TimerEventId,14);//把定时中断重新映射到 14 
           IRQ_reset(TimerEventId); 
           IRQ_enable(TimerEventId);// 
 
           TIMER_start(Htimer);//定时开始 
 
    while(1);//死循环 
 
           TIMER_close(Htimer); 
           GPIO_close(Hgpio);



/********************************************************************** 
*  中断服务程序 
**********************************************************************/ 
interrupt void c_int14(void)//中断服务程序 

    if(flag==0) 
    { 
                GPIO_pinWrite(Hgpio,GPIO_PIN3,flag);  
                flag=1; 
           } 
           else 
           { 
                GPIO_pinWrite(Hgpio,GPIO_PIN3,1); //点灯 
                flag=0; 
           } 

 
*------------------------------------------------------------------------------ 
* Global symbols defined here and exported out of this file 
*------------------------------------------------------------------------------ 
    .global _vectors//全局标号,可以在别处使用. 
    .global _c_int00 
    .global _vector1 
    .global _vector2 
    .global _vector3 
    .global _vector4 
    .global _vector5 
    .global _vector6 
    .global _vector7 
    .global _vector8 
   .global _vector9           
    .global _vector10   
    .global _vector11     
    .global _vector12   
    .global _vector13     
    .global _c_int14  ; Hookup the c_int14 ISR in main() 
    .global _vector15 
 
*------------------------------------------------------------------------------ 
* Global symbols referenced in this file but defined somewhere else.   
* Remember that your interrupt service routines need to be referenced here. 
*------------------------------------------------------------------------------ 
    .ref _c_int00//相当于 extern,在这里引用,在别处定义



*------------------------------------------------------------------------------ 
* This is a macro that instantiates one entry in the interrupt service table. 
*------------------------------------------------------------------------------ 
VEC_ENTRY .macro addr//定义中断向量入口地址 
 
    STW   B0,*--B15;保存B0 内容,中断产生后执行的第一条指令 
    MVKL  addr,B0; 
      MVKH  addr,B0;//把地址装入 B0 
    B     B0;跳转至 B0 中存储的地址 
    LDW   *B15++,B0;恢复B0内容; 由于C6000流水线的原因,跳转后仍然可以执行多条指                  
令 
    NOP   2 
    NOP    
    NOP    
    .endm 
 
 
*------------------------------------------------------------------------------ 
* This is a dummy interrupt service routine used to initialize the IST. 
*------------------------------------------------------------------------------ 
_vec_dummy:未定义中断服务程序 
  B     B3;其他没有定义的中断跳转至 B3 存储的地址 
  NOP  5 
 
*------------------------------------------------------------------------------ 
* This is the actual interrupt service table (IST). It is properly aligned and 
* is located in the subsection .text:vecs. This means if you don't explicitly 
* specify this section in your linker command file, it will default and link 
* into the .text section. Remember to set the ISTP register to point to this 
* table. 
*------------------------------------------------------------------------------ 
.sect ".text:vecs";定义段 
.align 1024;1024 字节对边界对齐 
 
_vectors: 
_vector0:    VEC_ENTRY _c_int00      ;RESET  跳转到_c_int00 ,_c_int00是 c语言程序的入口 
_vector1:    VEC_ENTRY _vec_dummy  ;NMI 
_vector2:    VEC_ENTRY _vec_dummy  ;RSVD 
_vector3:    VEC_ENTRY _vec_dummy ;  所有未定义中断均跳转到同一地址 
_vector4:    VEC_ENTRY _vec_dummy 
_vector5:    VEC_ENTRY _vec_dummy 
_vector6:    VEC_ENTRY _vec_dummy 
_vector7:    VEC_ENTRY _vec_dummy


_vector8:    VEC_ENTRY _vec_dummy 
_vector9:    VEC_ENTRY _vec_dummy 
_vector10:  VEC_ENTRY _vec_dummy 
_vector11:  VEC_ENTRY _vec_dummy 
_vector12:  VEC_ENTRY _vec_dummy 
_vector13:  VEC_ENTRY _vec_dummy 
_vector14:  VEC_ENTRY _c_int14  ; Hookup the c_int14 ISR in main()  定时中断中断向量 
_vector15:  VEC_ENTRY _vec_dummy 
 
*-------------------------------------------------------------------------------------------------------------


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]