下面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。 下面贴上主程序、外部中断3的服务程序和外部中断配置程序 void main(void)
{
// 步骤 1. 初始化系统控制:
// 设置PLL, WatchDog, 使能外设时钟
// 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到..
InitSysCtrl();
// 清除所有中断初始化中断向量表:
// 禁止CPU全局中断
DINT;
// 初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
// 这个函数放在了DSP2833x_PieVect.c源文件里面.
InitPieCtrl();
// 禁止CPU中断和清除所有CPU中断标志
IER = 0x0000;
IFR = 0x0000;
// PIE 向量表指针指向中断服务程(ISR)完成其初始化.
// 即使在程序里不需要使用中断功能,也要对 PIE 向量表进行初始化.
// 这样做是为了避免PIE引起的错误.
InitPieVectTable();
// 外部中断初始化
InitExInt();
// 本例使用下面的GPIO配置
configtestled();
LED1=0; //初始化LED电平 EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.XINT3 = &ISRExint3; // 将外部中断添加都中断向量表里
EDIS; // This is needed to disable write to EALLOW protected registers IER |= M_INT12; //使能第一组中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能总中断
PieCtrlRegs.PIEIER12.bit.INTx1= 1; //使能第12组中断里的第1个中断--XINT3中断 EINT; // 中断使能
ERTM; // 使能总实时中断
while(1); //While循环
}
/**********************************************************************************************/
interrupt void ISRExint3(void)
{
LED1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
} void InitExInt(void) //外部中断的配置
{
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 0; // GPIO35复用为GPIO功能
GpioCtrlRegs.GPBDIR.bit.GPIO35= 0; // GPIO35设置为输入
GpioCtrlRegs.GPBQSEL1.bit.GPIO35= 0; // GPIO35量化寄存器配置为0
GpioCtrlRegs.GPBPUD.bit.GPIO35 = 1;//禁止上拉
GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 35;//选择GPIO35为外部输入XINT3输入引脚
XIntruptRegs.XINT3CR.bit.POLARITY= 1; //1:上升沿//0:下降沿触发中断
XIntruptRegs.XINT3CR.bit.ENABLE = 1; //使能XINT3中断
EDIS;
}
|