TMS320F28335项目开发记录9_28335之中断系统

28335中断系统

1.中断系统

在这里我们要十分清楚DSP的中断系统。C28XX一共有16个中断源,其中有2个不可屏蔽的中断RESET和NMI、定时器1和定时器2分别使用中断13和14。这样还有12个中断都直接连接到外设中断扩展模块PIE上。说的简单一点就是PIE通过12根线与28335核的12个中断线相连。而PIE的另外一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。

这样PIE共管理12*8=96个外部中断。这12组大中断由28335核的中断寄存器IER来控制,即IER确定每个中断到底属于哪一组大中断(如IER |= M_INT12; 说明我们要用第12组的中断,但是第12组里面的什么中断CPU并不知道需要再由PIEIER确定
)。

接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想象到PIEIER共有12总即从PIEIER1-PIEIER12)。另外,PIE模块还有中断标志寄存器PIEIFR,同样它的低8位是来自外部中断的8个标志位,同样CPU的IFR寄存器是中断组的标志寄存器。由此看来,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,需要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的中断标志寄存器由硬件来清零。

   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.XINT2 = &ISRExint;          //告诉中断入口地址
   EDIS;    // This is needed to disable write to EALLOW protected registers
   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;       // Enable the PIE block使能PIE
   PieCtrlRegs.PIEIER1.bit.INTx5= 1;        //使能第一组中的中断5
   IER |= M_INT1;                           // Enable CPU 第一组中断
   EINT;                                    // Enable Global interrupt INTM
   ERTM;                                    // Enable Global realtime interrupt DBGM  

也就是说,12组中的每个中断都要完成上面的相同配置,剩下的才是去配置自己的中断。如我们提到的EXINT,即外面来个低电平我们就进入中断,完成我们的程序。在这里要介绍一下,DSP的GPIO口都可以配置为外部中断口,其配置方法如下:

     GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; //选择他们是GPIO口
     GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;
     GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0;
     GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;

     GpioCtrlRegs.GPBDIR.bit.GPIO54 = 0;//选择他们都是输入口
     GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;
     GpioCtrlRegs.GPBDIR.bit.GPIO56 = 0;
     GpioCtrlRegs.GPBDIR.bit.GPIO57 = 0;

     GpioCtrlRegs.GPBQSEL2.bit.GPIO54= 0;//GPIO时钟和系统时钟一样且支持GPIO
     GpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0;
     GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0;
     GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0;

     GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;//中断3选择GPIO
     GpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL = 55;
     GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL = 56;
     GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL = 57; 

     XIntruptRegs.XINT3CR.bit.POLARITY= 0;//触发模式为下降沿触发
     XIntruptRegs.XINT4CR.bit.POLARITY= 0;
     XIntruptRegs.XINT5CR.bit.POLARITY= 0;
     XIntruptRegs.XINT6CR.bit.POLARITY= 0;

     XIntruptRegs.XINT3CR.bit.ENABLE = 1;//使能中断
     XIntruptRegs.XINT4CR.bit.ENABLE = 1;
     XIntruptRegs.XINT5CR.bit.ENABLE = 1;
     XIntruptRegs.XINT6CR.bit.ENABLE = 1;

注意一点就是外部中断1和2只能对GPIO0—GPIO31配置;外部中断3和4、5、6、7只对GPIO32—GPIO63配置。

2.如何开启某个中断?

  • 设置中断向量。例如:PieVectTable.ADCINT = &adc_isr;等
  • 打开PIE控制器。PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
  • 使能PIE中对应外设的中断(相应group的相应pin)。例如:PieCtrlRegs.PIEIER1.bit.INTx8 = 1; PieCtrlRegs.PIEIER1.bit.INTx6 = 1;等
  • 使能CPU的相应中断(INT1~INT12)IER |= M_INT1;
  • 使能CPU响应中断EINT、ERTM;;

参考网址:http://www.61ic.com/Article/C2000/Delfino/201112/40118.html

3.中断标志有几级?作用是什么?

中断标志主要有三级CPU(有16个标志位)、PIE(有12组每组有12个标志位)和外设(有的外设没有)。

标志位在中断发生后锁存中断状态,即表示中断发生。在CPU响应中断后,会自动清除cpu级别的标志位IFR bit,同时将INTM bit 置位,以防止其它中断的发生;

CPU在从PIE中取中断向量时PIE会自动清除PIE级别的标志位PIEIFRx.y。所以在进入中断处理程序后除了外设所有中断位都已经清除。而中断处理程序中需要清除PIEACKx和外设的中断标志位(如果有的话)。

在CPU响应一个中断后,在进入ISR的时候,默认会关断全局中断,即在执行中断服务程序时,不会有其他中断来打断CPU,包括本次的中断事件。另外,如果外设的中断标志位不清除,不会循环进入这个中断服务函数,这个外设中断被阻断了。所以只有清除外设的中断服务程序,才能响应下一次的外设中断。PIEACK同理,如果没有PIEACK,这组所有中断都被阻断。

参考网址:http://www.deyisupport.com/question_answer/f/56/t/13047.aspx

http://www.61ic.com/Article/C2000/Delfino/201204/41777.html

时间: 2024-08-27 23:55:17

TMS320F28335项目开发记录9_28335之中断系统的相关文章

TMS320F28335项目开发记录1_CCS的使用介绍

CCS使用介绍 一.前言 本系列文章记录本人实际项目开发时对ti的DSP28335,以及CCS开发环境等的学习与记录,相对于2812来说,28335的资料还是比較少的,只是原理是相通的,28335说白了就是比2812多一些外设,寄存器等东西: 28335对于学习DSP的人来说,也算是一款入门级芯片.本人也是学习没多久就拿来做项目了,用到什么学什么,感觉事实上DSP没有想象中的难,无非就是和单片机一样.配置一些寄存器,驱动一些外设进行开发等,而DSP之所以难.难在它的算法部分,有了好的算法,DSP

TMS320F28335项目开发记录4_28335之启动模式(串口烧写Flash)

TMS320F28335支持多种启动模式,如下: // $Boot_Table: // // GPIO87 GPIO86 GPIO85 GPIO84 // XA15 XA14 XA13 XA12 // PU PU PU PU // ========================================== // 1 1 1 1 Jump to Flash <- "boot to Flash" // 1 1 1 0 SCI-A boot // 1 1 0 1 SPI-A

TMS320F28335项目开发记录10_28335之SCI模块

28335之SCI模块 1.介绍 TMS320F28335内部有三个SCI模块,SCIA.SCIB.SCIC. 每一个SCI模块都有一个接收器和发送器,SCI的接收器和发送器各有一个16级的FIFO(First In First Out先入先出)队列,它们都还有自己独立的使能位和中断位:可以工作在半双工或全双工模式: 串行通信的三种方式: 2.SCI深入 A. GPIO的管脚对应如下: SCIA对应GPIO28/29和GPIO35/36两组可选:   SCIB有四组管脚可以选择,分别是 O9/1

TMS320F28335项目开发记录3_28335简介

28335特性介绍 高性能静态CMOS技术 高达150MHZ(6.67ns的周期时间):1.9V / 1.8内核 ,3.3V I/O设计 高性能32位CPU IEEE-754单精度浮点单元 哈佛总线结构 高速中断响应处理 使用C/C++ 和汇编语言 6通道的DMA(用于ADC.McBsp.ePWM.XINTF和SARAM) 16位或32位外部接口XINTF 片上存储器 256K*16 Flash     34K*16 SARAM 8K*16 Boot ROM(支持软件引导模式SCI.SPI.CA

TMS320F28335项目开发记录6_28335之cmd文件详解

1.CMD文件的作用 CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间. 2.C语言生成的段 C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据,未初始化段只是保留变量的地址空间. 已初始化段: .text--C语言编译生成的汇编指令代码存放于此 .cinit--存放初始化的全局和静态变量 .const--字符串常量和const定义的全局和静态变量 .econst--字符串常量和far const定义的全局和静态变量 .print--全局构

TMS320F28335项目开发记录8_28335之GPIO引脚

GPIO(General-Purpose Input/Output)--通用输入/输出口: DSP28335 GPIO模块分为三类IO口:PORTA(0-31),PORTB(32-63),PORTC(64-87) 对GPIO模块的设置主要通过三类寄存器来完成,分别是:控制寄存器.数据寄存器.中断寄存器. 1.控制寄存器 GPxCTRL;    // GPIO x Control Register (GPIO0 to 31) //设置采样窗周期T=2*GPXCTRL*Tsysclk: GPxQSE

TMS320F28335项目开发记录3_28335简单介绍

28335特性介绍 高性能静态CMOS技术 高达150MHZ(6.67ns的周期时间):1.9V / 1.8内核 ,3.3V I/O设计 高性能32位CPU IEEE-754单精度浮点单元 哈佛总线结构 快速中断响应处理 使用C/C++ 和汇编语言 6通道的DMA(用于ADC.McBsp.ePWM.XINTF和SARAM) 16位或32位外部接口XINTF 片上存储器 256K*16 Flash     34K*16 SARAM 8K*16 Boot ROM(支持软件引导模式SCI.SPI.CA

TMS320F28335项目开发记录11_28335之存储系统

TMS320F28335为哈佛结构的DSP,在逻辑上有4M×16位的程序空间和4M×16位的数据空间,但在物理上已将程序空间和数据空间统一成一个4M×16位的空间. TMS320F28335片上有256K×16位的FLASH,34K×16位的SRAM,8K×16位的BOOT ROM,2K×16位的OPT ROM. 1. TMS320F28335片上SARAM TMS320F28335片内共有34K×16位单周期单次访问随机存储器的SARAM,分成10个块,他们分别称为M0.M1.L0-L7. M

TMS320F28335项目开发记录5_28335之CCS编程基础

CCS开发环境已经为我们封装好了许多片内外设寄存器的结构体,我们只需要包含相应的官方的头文件就可以使用了,那么它的内部具体是如何实现的呢? 下面来一个典型的例子: 1.使用结构体和联合体 A.用struct定义位域的作用: DSP2833x_Sci.h中有一段: struct SCICCR_BITS { // bit description Uint16 SCICHAR:3; // 2:0 Character length control Uint16 ADDRIDLE_MODE:1; // 3