DSP

创龙TMS320C6748开发板———中断介绍(1)中断及中断相关寄存器

2019-07-13 11:55发布

一、中断模块寄存器介绍             本节我们主要介绍C6748的中断模块。        中断是硬件系统的基本功能,DSP通过中断实现和其他芯片的实时交互。中断是指DSP在执行程序的过程中,当出现异常情况或特殊请求时,DSP停止现行程序的运行,转向这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。中断是实时处理内部或外部时间的一种内部机制。        TMS320C6748中一共有127个中断事件。如图所示。        由中断事件可以看到前4个事件是复用中断事件,通过EVTMASKn寄存器将4~127个中断事件复用到这四个中断事件中,见下图。例如,EVTMASK1中复用了EVT38,当EVT38发出中断请求,想应的EVT1同时发出中断请求。另外在MEVTFLAGn可以查看具体是哪个事件在请求中断。也许这里你会疑问,这样的设计有什么好处呢?在下面我们详细说明。        DSP是通过中断向量表作为相应的中断服务程序的入口,中断优先级自高至低。在TMS320C6748中共有16个中断。           中断优先级    中断名称 描述 0 Reset 复位中断 1 NMI 不可屏蔽中断 2 Reserved 预留(不可操作) 3 Reserved 预留(不可操作) 4 INT4 用户自定义中断 5 INT5 用户自定义中断 6 INT6 用户自定义中断 7~13 INT7~13 用户自定义中断 14 INT14 用户自定义中断 15 INT15 用户自定义中断        4个中断,编程一般用不到,Ti公司总共留给用户12个可自定义的中断,所以当使用到的中断特别多的情况下,复用中断事件有非常重要的意义。到此,相信大家也能猜到,我们需要把用到的中断事件分配到12个可用的中断。具体的寄存器为INTMUXn(中断复用寄存器)        7-35~7-3712个中断选择在寄存器中的位置,表7-9是中断选择的格式。事件到中断的映射如下图所示:        另外,常用的中断寄存器有以下几个:        ISTP:中断向量表起始地址寄存器;        IER:中断使能寄存器;        ICR:中断清除寄存器;        ISR:中断设置寄存器等等。 以上几个寄存器我们在具体介绍中断向量表汇编文件时再详细介绍。        在调制过程中,我们如果想调试其中一个中断,但是这个中断需要相关外设才能发起请求,这时我们可以设置EVENTSETn寄存器,设置事件发生。相应地,还有EVENTCLRn(中断事件清除寄存器)[每次完成中断设置后一定要清除所有中断标志,处理完中断后最好清除下相应标志位]EVENTFLAGn(中断事件标志寄存器)        在主程序中中断函数使用如下的关键字: interrupt void [用户定义名]() { }    二、CCS调试的一些经验        在编写DSP子函数时,你也许会使用一些变量,最好不要使用数据量较大的数组,因为DSP在运行子函数程序时,所涉及到的局部变量在内存中有一个临时存储区域,但是DSP不能识别这段区域中有没有别的程序段,这样很可能造成数组被中途截断,一部分数据出错或者程序运行出错。        解决方法:        1、直接定义全局变量,在主程序中分配确定的内存地址;        2、使用指针传递变量,子函数中不要定义新变量;        3、运用函数*UTIL_allocMem(Uint32size)在子函数中分配内存块。 // Allocatememory from the ad-hoc heap void*UTIL_allocMem(Uint32 size) {     void *cPtr;     Uint32 size_temp;     // Ensure word boundaries     size_temp = ((size + 4) >> 2 )<< 2;     if((currMemPtr + size_temp) > ((Uint32)&EXTERNAL_RAM_END))     {         return NULL;     }     cPtr = (void *) (((Uint32)&EXTERNAL_RAM_START) + currMemPtr);     currMemPtr += size_temp;     return cPtr; }