

上面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。
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;
}
user5976705:贴上的程序是主程序、外部中断3的服务程序和外部中断配置程序


上面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。
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;
}
user5976705:有人么


上面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。
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;
}
user5976705:顶一下..


上面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。
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;
}
mangui zhang:
回复 user5976705:
从图上看你的黄色脉冲不是每个沿都触发啊所以这个延时就不确定
最好降低黄色脉冲的频率让每次都触发中断看看是不是所有的延时都相等


上面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。
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;
}
user5976705:
回复 mangui zhang:


我把中断程序里面的内容修改成置位TOGGLE寄存器来翻转电平。上面两张图就是我修改之后测得的波形。两张图的第一个电平翻转时间不固定,其后的翻转时间都是固定的。这样比较明显,希望能帮忙解答下。


上面两张图是我用示波器两次截取在外部中断3中翻转0口电平的波形,程序是35口采样方波,上升沿触发外部中断3。我用的是同样的程序,我确定一点都没有修改。我做了10次实验,8次是和图1一样的波形,延时500ns,2次和图2一样,延时1us多。我不知道为什么这样。
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;
}
andrewyin yin:
回复 user5976705:
1、LED1这个管脚 上接的LED灯,还有其它东西没。建议将其上面的所有负载去掉,用电阻下拉或上拉,或悬空。
2、EXTINT3 管脚的IO属性里有 输入滤波采样频率 采样点 ,(对对对,别不服,IO输入也是有采样频率的)有专用的寄存器来设置,初始化时设置一下。
TI中文支持网



