DSP中断c2000系列

在DSP系统中CPU一直在运行主程序main函数,被打断的过程也就是暂停主程序处理转而去执行其它时间的过程。CPU运行主程序就像是日常生活,“中断”意味着发生了“意外事件”,需要立即进行处理。中断方式是一种灵活处理事件的方式,中断的合理安排可以提高DSP整个系统事件执行的效率。因此,中断系统在DSP中的地位非常重要,凡是事件驱动型的数字处理系统里面都应该有中断系统,中断就是为响应事件而存在的。

中断是硬件和软件驱动事件,它使得CPU停止当前的主程序,并转而去执行一个中断服务子程序。对于一个控制系统而言,主程序就是执行任务的主体事件,而一个控制系统的精髓在于,当系统遇到不确定事件时,根据当前状况,做出指向目的的决策和动作。在DSP的中断系统中,这一功能就是由中断系统来完成的。

中断系统的本质特征在于“中断”这个概念,它实质上就是DSP的CPU与外设之间进行信息交换的一种方式。在数字电路的发展过程当中,模块之间的信息交换经历了以下4个阶段。

无条件传送方式

无条件传送方式是一种最简单的程序控制传送方式,当程序执行到输入输出指令时,CPU不需要了解端口的状态,直接进行数据的传送。这种传送方式的输入输出接口电路最为简单,一般只需要设置数据缓冲寄存器和外设端口地址译码器就可以。其缺点也很明显,输入时外设必须准备好数据,输出时接口锁存器必须为空,这种信息传送方式只限于定时为已知且固定不变的低速I/O口。

查询传送方式

程序控制下的查询传送方式,又称为异步传送方式。他在执行输入输出操作之前,需要通过测试程序对外部设备的状态进行检查。当所选定的外设已经准备就绪后,才开始进行输入输出操作。其主要包含两个基本的工作环节:查询环节、传送环节。在对于查询传送方式,接口部分除了有数据传送到端口外,还必须有传送状态信息的端口。相对于无条件传送方式,其工作更为可靠,使用范围更广,且控制程序也比较容易,但是缺点在于其需要不断的测试状态信息,使得大量CPU工时将被查询环节消耗掉,导致传送效率较低,妨碍了数字系统高速性能的充分发挥。

中断传送方式

中断传输方式提高了CPU的使用效率,CPU与I/O设备关系是I/O主动,CPU被动,即I/O操作由I/O设备启动,这种传送方式中,中断服务程序必须是预先设计好的,且其程序入口已知,调用时间则由外部信号决定。其优点在于能够节省大量的CPU时间,实现CPU与外设并行工作,提高计算机的使用效率,并使得I/O设备的服务请求得到及时处理。可以适用于计算机工作量饱满,且实时性要求有很高的系统。

DMA传送方式

DMA只是一种单纯的数据传输。以上所述的三种传输方式更重的功能是控制信息在各个模块之间的传递作用,而不仅仅是传输数据。在DMA数据传输过程中,CPU会让出总线控制权,在传输大容量文件时,CPU占用率可能不到10%,虽然DMA方式的主要特点是速度快,但是运行其他程序尤其是一些大型软件时,也是需要从系统总线传输大量数据,就会使用户觉得系统运行过于缓慢。

DSP28335的中断采用的事三级中断机制,分别是外设计、PIE级和CPU级。如图3.4所示,这三级形成了一个串联系统,也就是说,对于一个具体的外设中断请求,必须通过三级的共同许可,否则只要有任意一级不许可,CPU最终都不会响应该外设中断。

图3.4 中断系统的三级中断机制

外设级

在程序的运行过程中,DSP硬件系统的某个外设由于软件或者是硬件的原因产生了一个中断事件,那么在这个外设的某个寄存器中与该中断事件相关的中断标志位(InterruptFlag,IF)被置1,一旦中断被使能,那么外设会立即向PIE发出中断请求。在外设级编程时,需要手动处理的地方有两处:一是外设中断的使能/屏蔽,需要将与该中断相关的外设寄存器中的中断使能位置1/清0;另外一处是外设中断标志位的清除,需要将与中断相关的外设寄存器中的中断标志位置1。

PIE级

PIE控制器将96个外设和外部引脚的中断进行了分组,每8个中断为1组,一共是12组,即PIE1~PIE12。和外设级相似,PIE控制器中的每一个组都会有一个中断标志寄存器PIEIFRx和一个中断使能寄存器PIEIERx(x=1~12)。每个寄存器的低8位对应于8个外设中断,高8位保留。PIE控制器是多路复用的,每一个组内有许多不同的外设中断共同使用一个CPU中断,但是每一个组在同一个时间内只能有一个中断被响应。在PIE级需要编程时手动处理的地方有两处:一处是PIE中断的使能/屏蔽,需要将对应组的使能寄存器PIEIERx的相应位进行置位1/清除0;另外一处是PIE应答寄存器PIEACK相关的清除,以使得CPU能够响应同组内的其它中断。

CPU级

CPU级也有中断标志寄存器IFR和中断使能寄存器IER。当某一个外设中断请求通过PIE发送到CPU时,CPU中断标志寄存器IFR中对应的中断标志位INTx就会被置位。这时,CPU不会马上去执行相应的中断,而是检查IER寄存器中相关位的使能情况和CPU寄存器ST1中全局中断屏蔽位INTM的使能情况,再决定是否执行该中断。CPU级中断标志位的置位和清零都是自动完成的。

CPU中断有32个中断源,包括RESET、NMI、EMUINT、ILLEGAL、12个用户定义的软件中断USER1~USER12和16个可屏蔽中断(INT1~INT14、RTOSINT和DLOGINT)。这些中断主要有两种触发方式:软件触发方式、硬件触发方式。无论是软件中断还是硬件中断,中断有可以分为:可屏蔽中断和不可屏蔽中断。每一个中断源都是一个32位(实际上有意义的只有22位)中断向量,由2个16为寄存器构成。中断向量就是一个地址。

在实际应用中,引用中断函数的方式如下面程序所示(以EVA定时中断为例):

……

interrupt void eva_timer1_isr(void); //必须在主函数前做中断函数声明

……

Void main(void)

{

……

}

interrupt void eva_timer1_isr(void)

{

……

}

并定义中断地址指向你得服务程序,例如:

PieVectTable.T1PINT = &eva_timer_isr;

那么,eva_timer1_isr也就成了中断服务程序。

(1)    首先我们还得回到CMD文件,在.cmd中定位系统中断表:

MEMORY

{

PAGE 0 :

……

PAGE 1 :

……

  PIE_VECT  : origin = 0x000D00, length = 0x000100

……

}

 

SECTIONS

{

……

  PieVectTable      : >  PIE_VECT,    PAGE= 1

……

}

(2)    在C中制定该中断的结构体(在DSP2833x_GlobalVariableDefs.c中初始化):

#pragma DATA_SECTION(PieVectTable,”PieVecTable”);

struct PIE_VECT_TABLE

{

……

   PINT   T1PINT;                      //EV-A

……

};

(3)    初始化该表(在DSP2833x_PieVect.c文件中)使之能够为主程序所使用:

const struct PIE_VECT_TABLEPieVectTableInit =

{

……

      T1PINT_ISR,                     // EV-A

……

};

 

void InitPieVectTable(void)

{

int16 i;

Uint32 *Source = (void *)&PieVectTableInit;

Uint32 *Dest = (void *) &PieVectTable;

 

EALLOW;

for(i = 0; i < 128; i ++)

      *Dest++ = *Source++;

EDIS;

//Enable the PIE Vector Table

PieCtrl.PIECRTL.bit.ENPIE =1;

}

这样EVA定时中断应该进入到DSP833x_DefaultIsr.c中:

interrupt void T1PINT_ISR(void)    // EV-A

{

……

}

但我们另外定义了T1PINT中断地址指向所要的服务程序,例如,PieVectTable.T1PINT = &eva_timer1_isr; 这样,中断就进入eva_timer1_isr了这样做的目的是interrupt voideva_timer1_isr(void){}可和main放在一起,便于程序浏览。

具体按键中断可参考下边链接:https://blog.csdn.net/Wx_Simba/article/details/78670104 

比较全面的知识以及定时器中断推荐:https://blog.csdn.net/FUBIN0000/article/details/78228513?locationNum=1&fps=1

TMS320f28335和TMS320f2812-XINTF接口的区别:http://blog.sina.com.cn/s/blog_6ff8309501011ls7.html

DSP28335的XINTF操作SRAM实验:https://www.cnblogs.com/429512065qhq/p/8433447.html

DSP外扩SRAM的应用测试心得体会:http://www.51hei.com/bbs/dpj-32468-1.html

注意事项:

参考以上几篇文章,基本上就可以操作完成了。但是有可能会出现问题,

(1)需要添加头文件DSP2833x_Xintf.c、DSP2833x_CpuTimers.c、DSP2833x_MemCopy.c,其它的SPI、PIE、全局变量、cmd等自行添加。我得是电机驱动,可以参考一下


(2) 如果要扩展SRAM,需要改写一下.cmd文件 如图


(3)#if(CPU_FRQ_150MHZ) 这个一定要注意MHZ还是MHz,在官方例程里 都是大写才能查找到,否则需要自定义才行

#define CPU_FRQ_150MHz 1

其它整理以后发出,欢迎指点

展开阅读全文

没有更多推荐了,返回首页