中断原理
三部分
注意 ,外部中断使能,PIE使能,CPU中断使能
外部中断有7个,PIE有12组,一个组有8个中断复用。只有一个CPU中断可执行。
外部中断原理
1、外部中断概述
外部中断结构图
外部中断XINT1对应的是0到31GPIO
1经过MUX寄存器
2中断控制寄存器xint1CR 1
进入PIE
GPIO的MUX复用寄存器
可以查到复用功能,而外部中断现在没特地说明,应该是设置成0;
外部中断寄存器;
gpio中断选择寄存器
xint1 和二只能用在0到31引脚上面
PIE结构图
PIE组的优先级表
可以见到如下优先级:可以通过表PIEx就是INTx
每个PIE组对应的8个对应中断
INT1.1表明是PIE组第一个中断,下表还是在2.5.3章节
PIE应答寄存器
进入中断后需要写入1,相应的应答清零。等待下次中断才进入
最终送入CPU
程序
DSP2833x_XIntrupt.h //关于外部中断寄存器
DSP2833x_PieVect.h //关于PIE向量
DSP2833x_PieCtrl.h //关于PIE组文件
DSP2833x_Device.h//关键字
可以在里面找到相应的寄存器
关键点,没有进不去中断
InitPieCtrl(); // pie组初始化
IER = 0x0000;//全局中断清零
IFR = 0x0000;//全局中断标记清零
InitPieVectTable();//pie向量表初始化
外部中断.c文件
#include"exti.h"
#include"led1.h"
interrupt void exti_GPIO12();
interrupt void EXTI1_IRQn(void);
void exti_init()
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
EDIS;
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;
GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;
GpioDataRegs.GPBCLEAR.bit.GPIO48 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;//复用0
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0;//与系统时钟同步
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;//gpio int1中断源
EDIS;
EALLOW;
XIntruptRegs.XINT1CR.bit.ENABLE = 1;//int1使能
XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿触发
EDIS;
EALLOW;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//PIE组1 包含有INTx4中断
PieVectTable.XINT1 = &exti_GPIO12;
EDIS;
IER |= M_INT1;//全局中断使能
EINT;// 全局 中断屏蔽位
ERTM;// 调式中断使能
}
interrupt void exti_GPIO12(void)
{
LED1_TOGGLE;//LED 反转
PieCtrlRegs.PIEACK.bit.ACK1 = 1;//PIE1应答清零
}
主函数文件
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "led1.h"
#include "key.h"
#include "epwm.h"
#include "exti.h"
int main()
{
Uint16 temp = 0;
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
led_init();
// key_init();
exti_init();
// led_all_flow_init();
// epwm_init(1000);
// EPWM6_set_compara(1000, 100);
while (1)
{
//led_twinkle();
//led_all_flow_twinkle();
//key_LED();
// DELAY_US(100000);
// EPWM6_set_compara(1000, temp += 10);
// if (temp > 1000)
// {
// temp = 0;
// }
}
}