DSP_TMS320F28335学习了很长时间,也用了很多次。每次用完过了一段时间就忘了,每次都有重复看,后来发现看完写点东西可以加深记忆,以及后续忘了之后再看。
DSP的中断系统是编程时最常用的,初学以及学完忘了之后,再回去看,往往很难理解。个人觉的主要从其结构理解会更容易一些。
1.总体结构
首先DSP28335支持1个不屏蔽中断(NMI)和16个具有优先级的可屏蔽中断。什么叫做不可屏蔽中断NMI呢?主要是指不需要通过IFR、IER、INTM来控制,只要满足中断条件需要就可以向CPU发送中断请求,其中断级别很高为3(复位为1,EMUINT-在线仿真为2);也就是说只要在正常情况下只要有满足中断条件,CPU就会保存当前的工作,率先来执行中断。当然这个中断是怎么实现的呢?主要是通过控制外部引脚,即通过外部引脚中断选择寄存器GIPOXNMISEL(详细见GPIO章节),来选择需要的引脚;注意这里还需要外部NMI中断控制寄存器XNMICR。具体怎样配置参考TI官方手册 http://www.ti.com.cn/cn/lit/ug/sprufb0d/sprufb0d.pdf。
![]()
![]()
16具有中断优先级的中断为(INT1——INT14,RTOSINT、DLONGINT)后面两个一般不用。其中定时器0可以选择INT1-INT12,但是PIE中断向量表选择在中断向量表第1组(即TIN0)。定时器1可以和其他类型的可以使用INT13,定时器2一般为DSP/BIOS保留使用中断INT14。也可以这么说定时器0,和1一般为用户使用,定时器2如果不被实时DSP/BIOS使用,可以被用户使用。还有它们对应的中断接口也不一样,需要注意注意一下。
在这14个中断接口中,又拿出12个中断接口为DSP的外设和外部中断使用(即INT1-INT12)组成了PIE中断扩展,中断扩展主要用来解决CPU没有空闲来解决所有中断的问题,所有采用了一个中断管理器PIE来管理这些中断。为了解决DSP28335太多的外设和外部中断XINT,又把每个中断接口分为INTx1——INTx8。这样就完成了12个中断扩展到96个中断的问题,当然这96个中断没有全被使用,有些是用户定义。具体结构如下图所示。
![]()
![]()
2.PIE中断结构
PIE中断实现过程主要分为以下几部分:
1.外设或者是外部引脚产生中断
外设如SCI或者定时器当满足中断条件时,一般每个外设都有一个中断标志位如定时器的TIF,一般会置位。如果外设中断使能,将向PIE寄存器发送中断请求,同时将PIE寄存器的PIE IFR寄存器置位。注意外设的中断标志只有软件才能清除,一般在中断程序结尾,清除中断标志。否则将一直置位,并且在中断使能的情况下一直向PIE发送中断请求。
2.PIE级的中断
当PIE的管理器收到来自某个PIEINTx(12个中断接口之一)的中断时,首先将对应接口的中断标志PIE IFR置位,如果此时该端口的中断使能即PIE IER对应置位,这时候就要检查PIEACK位是否为0,如果为0,这向CPU发送中断请求,否则只有等待PIEACK为0。一般情况PIEACK为1,说明还有其他接口的中断正在处理。只有等待。另外还要注意PIEACK位的清除也只有软件清除,一般在中断程序的结尾向对应PIE ACK位写1来清除。
3.CPU级中断
当PIE ACK为0时,对应的INTx(12个的一个)像CPU发送中断请求,这时候就用到了CPU级中断寄存器IFR,和IER。IFR在INTx端口发送CPU级中断请求后置位。IFR为16位的寄存器正好对应上面的16个中断控制,它是可屏蔽中断的总体的中断标志。同样如果对应位的IER(中断使能寄存器使能),就需要判断全局中断屏蔽位INTM位是否为0,如果为0,CPU保存当前工作状态经过9个周期后开始执行中断。如过INTM为1,则只有等待。一般INTM为1,说CPU正在处理别的中断。INTM只是个位不是寄存器,编程中不会出现,由硬件控制,同时其清除也在中断程序执行完后由硬件自动清除。具体执行流程如下图
总的说来,DSP28335的外部中断是通过层层控制来实现的,可以表示为
外设中断标志产生——外设中断使能——PIEx IFR置位——PIExIER使能——判断PIExACK——IFR置位——IER使能——判断INTM位——CPU执行中断程序。
个人认为PIExACK的作用于INTM的作用相同都是判断同组中有没有其他中断的产生。如PIExACK判断INTx中其它8个有没有产生中断请求,INTM判断其它INTx 12个接口有没有产生中断请求。
还要注意上图中stageH中实现了IFRx和IERx的清零,也就是IER和IFR由系统自动清零,stage I 完成了获取中断向量表(中断程序的地址)和PIE IFR和IER清零(对应位),在stage J 要在程序中完成PIExACK的清零(程序中实行),INTM的自动清零。
3、外部中断XINT和中断向量表的原理以后有时间再续写。
到此DSP28335的中断结构大体说完,个人观点,错误难免,欢迎纠正。