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。

 

 程序:

程序:

/*********************************************

   标题:INT_test.c

   软件平台:CCS v5.2

   硬件平台:C2000 LaunchPad

   主频:60M

 

      描述:练习外中断,测试按键

 

      基于2802x C/C++ Header Files V1.26

 

 

   author:小船

   data:2012-09-25

 

   As supplied, this project is configured for "boot to SARAM"

   operation.  The 2802x Boot Modetable is shown below.

 

   $Boot_Table

   While an emulator is connected to your device, the TRSTn pin = 1,

   which sets the device into EMU_BOOT boot mode. In this mode, the

   peripheral boot modes are as follows:

 

      Boot Mode:   EMU_KEY        EMU_BMODE

                   (0xD00)       (0xD01)

      ---------------------------------------

      Wait      !=0x55AA           X

      I/O          0x55AA            0x0000

      SCI          0x55AA            0x0001

      Wait        0x55AA            0x0002

      Get_Mode     0x55AA            0x0003

      SPI          0x55AA            0x0004

      I2C          0x55AA            0x0005

      OTP          0x55AA            0x0006

      Wait         0x55AA            0x0007

      Wait         0x55AA            0x0008

      SARAM        0x55AA            0x000A    <-- "Boot to SARAM"

      Flash        0x55AA            0x000B

      Wait         0x55AA            Other

 

  Write EMU_KEY to 0xD00 and EMU_BMODE to 0xD01 via the debugger

  according to the Boot Mode Table above. Build/Load project,

  Reset the device, and Run example

 

  $End_Boot_Table

**********************************************/

#include"DSP28x_Project.h"     // Device Headerfile and Examples Include File

#include"LEDs.h"

 

interruptvoidKey_On(void);

 

void main(void)

{

 

// Step 1. Initialize SystemControl:

// PLL, WatchDog, enablePeripheral Clocks

// This example function is foundin the DSP2802x_SysCtrl.c file.

  InitSysCtrl();

 

// Step 2. Initalize GPIO:

// This example function is foundin the DSP2802x_Gpio.c file and

// illustrates how to set the GPIOto it's default state.

// InitGpio();  // Skipped for this example

 

 

// Step 3. Clear all interruptsand initialize PIE vector table:

// Disable CPU interrupts

  DINT;

 

// Initialize PIE controlregisters to their default state.

// The default state is all PIEinterrupts disabled and flags

// are cleared.

// This function is found in theDSP2802x_PieCtrl.c file.

  InitPieCtrl();

 

// Disable CPU interrupts andclear all CPU interrupt flags:

  IER = 0x0000;

  IFR = 0x0000;

 

// Initialize the PIE vector tablewith pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entiretable, even if the interrupt

// is not used in thisexample.  This is useful for debugpurposes.

// The shell ISR routines arefound in DSP2802x_DefaultIsr.c.

// This function is found inDSP2802x_PieVect.c.

  InitPieVectTable();

 

 

// Step 4. Initialize all theDevice Peripherals:

// This function is found inDSP2802x_InitPeripherals.c

// InitPeripherals(); // Notrequired for this example

 

// Step 5. User specific code:

 

  EALLOW;

 

  PieVectTable.XINT1= &Key_On;

 

  GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; //除能上拉电阻

  GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;  //GPIO12

  GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;   //输入

  GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2; // 6 samples

  GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xff;//采样周期为510*Tsysclk,窗口宽度为5*510*Tsysclk=2550/60M=42.5us

 

  GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; //GPIO12作为xint1的中断源

 

  EDIS;

 

  XIntruptRegs.XINT1CR.bit.POLARITY = 1;    //上升沿触发中断

  XIntruptRegs.XINT1CR.bit.ENABLE = 1;      //外中断1使能

 

  EALLOW;

  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  //使能PIE

  PieCtrlRegs.PIEIER1.bit.INTx4 = 1;  //使能int1.4

 

  IER |= 0x0001;//使能int1

  EINT;

  EDIS;

 

  LEDs_init();

  while(1)

  {

  };

}

 

interruptvoidKey_On(void)

{

    LED_toggle(LED0);

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

 

//=========================================================================

// No more.

//=========================================================================


 

 


你可能感兴趣的:(DSP,C28x)