// 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中断配置的频率和发生时间是如何设置的
// 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文件。希望你能多多指教,谢谢,非常感谢!
// 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的结构是实时控制结构,所以不建议设计这种嵌套结构。最好从机智上把中断时间相互措开。
不知道你想通过这种设计实现那种功能,有没有可能措开中断发生时间。
// 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:
你好,经过今下午的调试与整理,找到了问题的本质所在,但是不知道该怎么接收与处理这个问题?
还请多指点指点!具体情况请看附件!
谢谢,非常感谢!