TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28027中断

中断

参考文档SPRUFN3C

外设中断示意图:


 

外设级:

       当一个外设发生了一个中断,特定的外设寄存器中相应的中断标志位(IF)就会置位。如果相应的中断使能位被设置,外设就会向PIE控制器产生一个中断请求。如果中断在外设级没有被使能,IF位仍然保持置1状态直到被软件清除。如果中断之后使能,IF位仍然是1,中断请求将会被PIE响应。

       外设寄存器的中断标志应该被手动清除。

 

PIE级:

       PIE把 8个外设和外中断多路复用为一个CPU中断。这些中断被分为12组。同一组的中断复用一个CPU中断。例如:PIE组1复用CPU中断1(INT1),PIE组12复用CPU中断12(INT12)。连接到CPU其余的中断的中断源是没有被复用的,PIE直接将请求传递到CPU。

对于复用的中断源,每个中断组的PIE块中有相应的标志寄存器(PIEIFRx)和使能寄存器(PIEIERx)(X = PIE组1 – PIE组12)。组内的每个位,称为y,对应于一个8路复用的中断,因此PIEIFRx.y 和PIEIERx.y (y =1-8)对应于中断PIE组X(X= 1〜12)。另外,每个PIE中断组都有一个中断答应位。

当有向PIE控制器的请求时,相应的PIE中断标志(PIEIFRx.y)就会置1,如果PIE中断使能位(PIEIERx.y)被设置,PIE控制器就会检查相应的PIEACKx位,确认CPU是否为中断做好准备。如果PIEACKx位已被清除,PIE就会向CPU发送一个中断请求。如果PIEACKx位被置位,PIE等到它别清除,再发送INTx的请求。

 

CPU级:

       当请求被发送到CPU,CPU级相应的与INTx的中断标志位(IFR)被置位,一旦在IFR的标志被设定后,相应的中断不会被服务,直到是但设置了CPU的中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)和全局中断屏蔽位(INTM)。

 

 

 

 

外中断配置步骤:

1.     编写中断服务函数

2.     把中断服务函数地址赋值到的中断矢量表。

3.     使能或者除能上拉电阻(GPxPUD)。

ePWM模式默认除能,其他功能默认使能。模拟IO没有上拉电阻。

4.     选择引脚功能(GPxMUXn)。

5.     如果是数字IO的话,选择方向(GPxDIR)。

6.     输入采样设置(GPxCTRL、 GPxQSELn)。

7.     把相应的GPIO作为XINTn(n=1-3)中断源GPIOxINTnSEL

8.     选择低功耗模式下的唤醒输入引脚(GPIOLPMSEL)。

9.     设置触发方式(xINTnCR)。

10.  使能XINTn中断(外设级使能)。(xINTnCR)

11.  使能PIE。(PIECTRL)

12.  PIE中使能该中断(PIE级使能)。PIEIERn)

13.  在IER中使能该组的中断(CPU级使能)。

14.  总中断使能。

15.  在中断服务函数中要清除中断应答位

 

 

程序设计:

       按键GPIO12触发外中断,在中断服务函数中翻转IO。

 

 程序:

[plain] view plain copy

  1. 程序:  
  2.   
  3. /*********************************************  
  4.   
  5.    标题:INT_test.c  
  6.   
  7.    软件平台:CCS v5.2  
  8.   
  9.    硬件平台:C2000 LaunchPad  
  10.   
  11.    主频:60M  
  12.   
  13.    
  14.   
  15.       描述:练习外中断,测试按键  
  16.   
  17.    
  18.   
  19.       基于2802x C/C++ Header Files V1.26  
  20.   
  21.    
  22.   
  23.    
  24.   
  25.    author:小船  
  26.   
  27.    data:2012-09-25  
  28.   
  29.    
  30.   
  31.    As supplied, this project is configured for "boot to SARAM"  
  32.   
  33.    operation.  The 2802x Boot Modetable is shown below.  
  34.   
  35.    
  36.   
  37.    $Boot_Table  
  38.   
  39.    While an emulator is connected to your device, the TRSTn pin = 1,  
  40.   
  41.    which sets the device into EMU_BOOT boot mode. In this mode, the  
  42.   
  43.    peripheral boot modes are as follows:  
  44.   
  45.    
  46.   
  47.       Boot Mode:   EMU_KEY        EMU_BMODE  
  48.   
  49.                    (0xD00)       (0xD01)  
  50.   
  51.       —————————————  
  52.   
  53.       Wait      !=0x55AA           X  
  54.   
  55.       I/O          0x55AA            0x0000  
  56.   
  57.       SCI          0x55AA            0x0001  
  58.   
  59.       Wait        0x55AA            0x0002  
  60.   
  61.       Get_Mode     0x55AA            0x0003  
  62.   
  63.       SPI          0x55AA            0x0004  
  64.   
  65.       I2C          0x55AA            0x0005  
  66.   
  67.       OTP          0x55AA            0x0006  
  68.   
  69.       Wait         0x55AA            0x0007  
  70.   
  71.       Wait         0x55AA            0x0008  
  72.   
  73.       SARAM        0x55AA            0x000A    <– "Boot to SARAM"  
  74.   
  75.       Flash        0x55AA            0x000B  
  76.   
  77.       Wait         0x55AA            Other  
  78.   
  79.    
  80.   
  81.   Write EMU_KEY to 0xD00 and EMU_BMODE to 0xD01 via the debugger  
  82.   
  83.   according to the Boot Mode Table above. Build/Load project,  
  84.   
  85.   Reset the device, and Run example  
  86.   
  87.    
  88.   
  89.   $End_Boot_Table  
  90.   
  91. **********************************************/  
  92.   
  93. #include"DSP28x_Project.h"     // Device Headerfile and Examples Include File  
  94.   
  95. #include"LEDs.h"  
  96.   
  97.    
  98.   
  99. interruptvoidKey_On(void);  
  100.   
  101.    
  102.   
  103. void main(void)  
  104.   
  105. {  
  106.   
  107.    
  108.   
  109. // Step 1. Initialize SystemControl:  
  110.   
  111. // PLL, WatchDog, enablePeripheral Clocks  
  112.   
  113. // This example function is foundin the DSP2802x_SysCtrl.c file.  
  114.   
  115.   InitSysCtrl();  
  116.   
  117.    
  118.   
  119. // Step 2. Initalize GPIO:  
  120.   
  121. // This example function is foundin the DSP2802x_Gpio.c file and  
  122.   
  123. // illustrates how to set the GPIOto it's default state.  
  124.   
  125. // InitGpio();  // Skipped for this example  
  126.   
  127.    
  128.   
  129.    
  130.   
  131. // Step 3. Clear all interruptsand initialize PIE vector table:  
  132.   
  133. // Disable CPU interrupts  
  134.   
  135.   DINT;  
  136.   
  137.    
  138.   
  139. // Initialize PIE controlregisters to their default state.  
  140.   
  141. // The default state is all PIEinterrupts disabled and flags  
  142.   
  143. // are cleared.  
  144.   
  145. // This function is found in theDSP2802x_PieCtrl.c file.  
  146.   
  147.   InitPieCtrl();  
  148.   
  149.    
  150.   
  151. // Disable CPU interrupts andclear all CPU interrupt flags:  
  152.   
  153.   IER = 0x0000;  
  154.   
  155.   IFR = 0x0000;  
  156.   
  157.    
  158.   
  159. // Initialize the PIE vector tablewith pointers to the shell Interrupt  
  160.   
  161. // Service Routines (ISR).  
  162.   
  163. // This will populate the entiretable, even if the interrupt  
  164.   
  165. // is not used in thisexample.  This is useful for debugpurposes.  
  166.   
  167. // The shell ISR routines arefound in DSP2802x_DefaultIsr.c.  
  168.   
  169. // This function is found inDSP2802x_PieVect.c.  
  170.   
  171.   InitPieVectTable();  
  172.   
  173.    
  174.   
  175.    
  176.   
  177. // Step 4. Initialize all theDevice Peripherals:  
  178.   
  179. // This function is found inDSP2802x_InitPeripherals.c  
  180.   
  181. // InitPeripherals(); // Notrequired for this example  
  182.   
  183.    
  184.   
  185. // Step 5. User specific code:  
  186.   
  187.    
  188.   
  189.   EALLOW;  
  190.   
  191.    
  192.   
  193.   PieVectTable.XINT1= &Key_On;  
  194.   
  195.    
  196.   
  197.   GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; //除能上拉电阻  
  198.   
  199.   GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;  //GPIO12  
  200.   
  201.   GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;   //输入  
  202.   
  203.   GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2; // 6 samples  
  204.   
  205.   GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xff;//采样周期为510*Tsysclk,窗口宽度为5*510*Tsysclk=2550/60M=42.5us  
  206.   
  207.    
  208.   
  209.   GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; //GPIO12作为xint1的中断源  
  210.   
  211.    
  212.   
  213.   EDIS;  
  214.   
  215.    
  216.   
  217.   XIntruptRegs.XINT1CR.bit.POLARITY = 1;    //上升沿触发中断  
  218.   
  219.   XIntruptRegs.XINT1CR.bit.ENABLE = 1;      //外中断1使能  
  220.   
  221.    
  222.   
  223.   EALLOW;  
  224.   
  225.   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  //使能PIE  
  226.   
  227.   PieCtrlRegs.PIEIER1.bit.INTx4 = 1;  //使能int1.4  
  228.   
  229.    
  230.   
  231.   IER |= 0x0001;//使能int1  
  232.   
  233.   EINT;  
  234.   
  235.   EDIS;  
  236.   
  237.    
  238.   
  239.   LEDs_init();  
  240.   
  241.   while(1)  
  242.   
  243.   {  
  244.   
  245.   };  
  246.   
  247. }  
  248.   
  249.    
  250.   
  251. interruptvoidKey_On(void)  
  252.   
  253. {  
  254.   
  255.     LED_toggle(LED0);  
  256.   
  257.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;  
  258.   
  259. }  
  260.   
  261.    
  262.   
  263. //=========================================================================  
  264.   
  265. // No more.  
  266.   
  267. //=========================================================================

Johnson Chen1:

请问你的问题是什么?

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28027中断
分享到: 更多 (0)