中断
参考文档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.
- //=========================================================================
Johnson Chen1:
请问你的问题是什么?