TI中文支持网
TI专业的中文技术问题搜集分享网站

DSP28335 中断嵌套无法一直执行问题

 本意是,在ADC中断中嵌套外部中断0程序然后回到ADC中断,如此循环,但是出现了不能无限的执行这个循环问题?
 附带中断程序如下:

// INT1.4
interrupt void XINT1_ISR(void)
{
DSP_RESERVE_DATA = 1;
DELAY_US(1);
D10 = ~D10;
DELAY_US(100000);

Num_2++;
Songsong_Show_Num(100,120,Num_2,3,RED);    // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

// INT1.6
interrupt void ADCINT_ISR(void) // ADC
{
volatile Uint16 Temp=0;

//——————————————————————————————–
//—– 中断嵌套说明:DSP进入中断服务程序后默认关闭所有中断(外设级/PIE级/CPU级/全局中断),则
//—– 若需中断嵌套,必须打开重新打开所有中断,否则无法实现嵌套功能
//—– 注: 若需要实现中断嵌套,必须应答当前中断
//——————————————————————————————–
//—— 嵌套 外部中断1(XINT1) 中断程序
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能外设级中断
IER |= M_INT1; // 使能CPU级中断
EINT; // 使能全局中断
ERTM; //—– 使能 实时中断 <==>仿真中断
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; // 应答当前中断,实现中断嵌套

Temp = (AdcRegs.ADCRESULT0)>>4;
D8 = ~D8;
DELAY_US(100000);
Num_1++;
Songsong_Show_Num(100,100,Num_1,3,RED);        // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

DSP_RESERVE_DATA = 1;
DELAY_US(100);
DSP_RESERVE_DATA = 0;
DELAY_US(100);

D14 = ~D14;
DELAY_US(100000);
Num_3++;
Songsong_Show_Num(100,140,Num_3,3,RED);       // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

根据实际调试所得结果:发现不同的DELAY_US()延时对应的变量值不同,那么也就是说,进去中断的此时不同。

结果如下:

第一组:Num_1:    030;    Num_2:   029;       Num_:   029;

第二组:Num_1:    032;    Num_2:   031;       Num_:   031;

第三组:Num_1:    031;    Num_2:   030;       Num_:   030;

第四组:Num_1:    032;    Num_2:   031;       Num_:   031;

        自己对中断嵌套的解释:进入中断都会保护现场,DSP进行压栈,但是退出中断后,会进行出栈,一进一出,按理是不会出现这个问题啊?事实却不是这样的!不知道对否!

请问下,

            1)如何才能实现我的本意,并且可以一直循环进行,即不会停止运行!

            2)像这样的中断方式属于多级中断嵌套还是单级中断嵌套?

            3)ADC中断响应外部中断1,会进行压栈处理,那么外部中断1退回到ADC中断会进行出栈处理吗?如果不会出栈处理,这个问题倒是能理解,如果会处理,那么是不是就和有过有所矛盾呢?而且这个也和我们之前学的理论知识有冲突!

        在此还请各位大神多多指教,在此万分感谢,谢谢!

        

Igor An:

请问不能无限循环这个机制是出现了什么问题?

外部中断不能再进了还是ADC中断不能再进了?

外部中断的中断源发生频率和时间和ADC中断配置的频率和发生时间是如何设置的

 本意是,在ADC中断中嵌套外部中断0程序然后回到ADC中断,如此循环,但是出现了不能无限的执行这个循环问题?
 附带中断程序如下:

// INT1.4
interrupt void XINT1_ISR(void)
{
DSP_RESERVE_DATA = 1;
DELAY_US(1);
D10 = ~D10;
DELAY_US(100000);

Num_2++;
Songsong_Show_Num(100,120,Num_2,3,RED);    // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

// INT1.6
interrupt void ADCINT_ISR(void) // ADC
{
volatile Uint16 Temp=0;

//——————————————————————————————–
//—– 中断嵌套说明:DSP进入中断服务程序后默认关闭所有中断(外设级/PIE级/CPU级/全局中断),则
//—– 若需中断嵌套,必须打开重新打开所有中断,否则无法实现嵌套功能
//—– 注: 若需要实现中断嵌套,必须应答当前中断
//——————————————————————————————–
//—— 嵌套 外部中断1(XINT1) 中断程序
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能外设级中断
IER |= M_INT1; // 使能CPU级中断
EINT; // 使能全局中断
ERTM; //—– 使能 实时中断 <==>仿真中断
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; // 应答当前中断,实现中断嵌套

Temp = (AdcRegs.ADCRESULT0)>>4;
D8 = ~D8;
DELAY_US(100000);
Num_1++;
Songsong_Show_Num(100,100,Num_1,3,RED);        // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

DSP_RESERVE_DATA = 1;
DELAY_US(100);
DSP_RESERVE_DATA = 0;
DELAY_US(100);

D14 = ~D14;
DELAY_US(100000);
Num_3++;
Songsong_Show_Num(100,140,Num_3,3,RED);       // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

根据实际调试所得结果:发现不同的DELAY_US()延时对应的变量值不同,那么也就是说,进去中断的此时不同。

结果如下:

第一组:Num_1:    030;    Num_2:   029;       Num_:   029;

第二组:Num_1:    032;    Num_2:   031;       Num_:   031;

第三组:Num_1:    031;    Num_2:   030;       Num_:   030;

第四组:Num_1:    032;    Num_2:   031;       Num_:   031;

        自己对中断嵌套的解释:进入中断都会保护现场,DSP进行压栈,但是退出中断后,会进行出栈,一进一出,按理是不会出现这个问题啊?事实却不是这样的!不知道对否!

请问下,

            1)如何才能实现我的本意,并且可以一直循环进行,即不会停止运行!

            2)像这样的中断方式属于多级中断嵌套还是单级中断嵌套?

            3)ADC中断响应外部中断1,会进行压栈处理,那么外部中断1退回到ADC中断会进行出栈处理吗?如果不会出栈处理,这个问题倒是能理解,如果会处理,那么是不是就和有过有所矛盾呢?而且这个也和我们之前学的理论知识有冲突!

        在此还请各位大神多多指教,在此万分感谢,谢谢!

        

qingsong tan:

回复 Igor An:

你好,很高兴能收到你的解答!为了能为你详细的描述现况,为此我专门整理成了一个Word文件。希望你能多多指教,谢谢,非常感谢!

 本意是,在ADC中断中嵌套外部中断0程序然后回到ADC中断,如此循环,但是出现了不能无限的执行这个循环问题?
 附带中断程序如下:

// INT1.4
interrupt void XINT1_ISR(void)
{
DSP_RESERVE_DATA = 1;
DELAY_US(1);
D10 = ~D10;
DELAY_US(100000);

Num_2++;
Songsong_Show_Num(100,120,Num_2,3,RED);    // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

// INT1.6
interrupt void ADCINT_ISR(void) // ADC
{
volatile Uint16 Temp=0;

//——————————————————————————————–
//—– 中断嵌套说明:DSP进入中断服务程序后默认关闭所有中断(外设级/PIE级/CPU级/全局中断),则
//—– 若需中断嵌套,必须打开重新打开所有中断,否则无法实现嵌套功能
//—– 注: 若需要实现中断嵌套,必须应答当前中断
//——————————————————————————————–
//—— 嵌套 外部中断1(XINT1) 中断程序
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能外设级中断
IER |= M_INT1; // 使能CPU级中断
EINT; // 使能全局中断
ERTM; //—– 使能 实时中断 <==>仿真中断
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; // 应答当前中断,实现中断嵌套

Temp = (AdcRegs.ADCRESULT0)>>4;
D8 = ~D8;
DELAY_US(100000);
Num_1++;
Songsong_Show_Num(100,100,Num_1,3,RED);        // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

DSP_RESERVE_DATA = 1;
DELAY_US(100);
DSP_RESERVE_DATA = 0;
DELAY_US(100);

D14 = ~D14;
DELAY_US(100000);
Num_3++;
Songsong_Show_Num(100,140,Num_3,3,RED);       // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

根据实际调试所得结果:发现不同的DELAY_US()延时对应的变量值不同,那么也就是说,进去中断的此时不同。

结果如下:

第一组:Num_1:    030;    Num_2:   029;       Num_:   029;

第二组:Num_1:    032;    Num_2:   031;       Num_:   031;

第三组:Num_1:    031;    Num_2:   030;       Num_:   030;

第四组:Num_1:    032;    Num_2:   031;       Num_:   031;

        自己对中断嵌套的解释:进入中断都会保护现场,DSP进行压栈,但是退出中断后,会进行出栈,一进一出,按理是不会出现这个问题啊?事实却不是这样的!不知道对否!

请问下,

            1)如何才能实现我的本意,并且可以一直循环进行,即不会停止运行!

            2)像这样的中断方式属于多级中断嵌套还是单级中断嵌套?

            3)ADC中断响应外部中断1,会进行压栈处理,那么外部中断1退回到ADC中断会进行出栈处理吗?如果不会出栈处理,这个问题倒是能理解,如果会处理,那么是不是就和有过有所矛盾呢?而且这个也和我们之前学的理论知识有冲突!

        在此还请各位大神多多指教,在此万分感谢,谢谢!

        

Igor An:

回复 qingsong tan:

从描述上看,感觉可能性比较大的会是ADC中断没有完全运行结束时,下一个ADC中断事件已经产生,也就是中断事件相互重叠了。

这种中断嵌套属于一层嵌套。

另外由于c2000的结构是实时控制结构,所以不建议设计这种嵌套结构。最好从机智上把中断时间相互措开。

不知道你想通过这种设计实现那种功能,有没有可能措开中断发生时间。

 本意是,在ADC中断中嵌套外部中断0程序然后回到ADC中断,如此循环,但是出现了不能无限的执行这个循环问题?
 附带中断程序如下:

// INT1.4
interrupt void XINT1_ISR(void)
{
DSP_RESERVE_DATA = 1;
DELAY_US(1);
D10 = ~D10;
DELAY_US(100000);

Num_2++;
Songsong_Show_Num(100,120,Num_2,3,RED);    // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

// INT1.6
interrupt void ADCINT_ISR(void) // ADC
{
volatile Uint16 Temp=0;

//——————————————————————————————–
//—– 中断嵌套说明:DSP进入中断服务程序后默认关闭所有中断(外设级/PIE级/CPU级/全局中断),则
//—– 若需中断嵌套,必须打开重新打开所有中断,否则无法实现嵌套功能
//—– 注: 若需要实现中断嵌套,必须应答当前中断
//——————————————————————————————–
//—— 嵌套 外部中断1(XINT1) 中断程序
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能外设级中断
IER |= M_INT1; // 使能CPU级中断
EINT; // 使能全局中断
ERTM; //—– 使能 实时中断 <==>仿真中断
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; // 应答当前中断,实现中断嵌套

Temp = (AdcRegs.ADCRESULT0)>>4;
D8 = ~D8;
DELAY_US(100000);
Num_1++;
Songsong_Show_Num(100,100,Num_1,3,RED);        // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

DSP_RESERVE_DATA = 1;
DELAY_US(100);
DSP_RESERVE_DATA = 0;
DELAY_US(100);

D14 = ~D14;
DELAY_US(100000);
Num_3++;
Songsong_Show_Num(100,140,Num_3,3,RED);       // 自己的TFT_LCD显示屏显示函数,在发送不能无限循环是所调试用的,方便观察

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
}

根据实际调试所得结果:发现不同的DELAY_US()延时对应的变量值不同,那么也就是说,进去中断的此时不同。

结果如下:

第一组:Num_1:    030;    Num_2:   029;       Num_:   029;

第二组:Num_1:    032;    Num_2:   031;       Num_:   031;

第三组:Num_1:    031;    Num_2:   030;       Num_:   030;

第四组:Num_1:    032;    Num_2:   031;       Num_:   031;

        自己对中断嵌套的解释:进入中断都会保护现场,DSP进行压栈,但是退出中断后,会进行出栈,一进一出,按理是不会出现这个问题啊?事实却不是这样的!不知道对否!

请问下,

            1)如何才能实现我的本意,并且可以一直循环进行,即不会停止运行!

            2)像这样的中断方式属于多级中断嵌套还是单级中断嵌套?

            3)ADC中断响应外部中断1,会进行压栈处理,那么外部中断1退回到ADC中断会进行出栈处理吗?如果不会出栈处理,这个问题倒是能理解,如果会处理,那么是不是就和有过有所矛盾呢?而且这个也和我们之前学的理论知识有冲突!

        在此还请各位大神多多指教,在此万分感谢,谢谢!

        

qingsong tan:

回复 Igor An:

你好,经过今下午的调试与整理,找到了问题的本质所在,但是不知道该怎么接收与处理这个问题?

 还请多指点指点!具体情况请看附件!

谢谢,非常感谢!

赞(0)
未经允许不得转载:TI中文支持网 » DSP28335 中断嵌套无法一直执行问题
分享到: 更多 (0)