看书上说如果你进入AD中断后,那么这时总中断也应该被关了吧,如果你不在这个中断服务程序里开总中断的话,那么以后就永远不会进入中断了吧?<br /><br />今天我调程序dsp2407时,写了下面代码:<br />interrupt void ADCInt(void)<br />{<br /> //Get ADC result<br /> Disable(); //关中断<br /> count++;<br /> asm(" clrc SXM");<br /> j = RESULT0;<br /> adcResult[i++] = (*j) >> 6;<br /> if (i == 22)<br /> i = 0;<br /> //*ADCTRL2 |= 0x4000;<br /> SocADC();<br /> //*IFR = *IFR | 0x0001;<br /> if (count>65534)<br /> count = 0;<br /> //Enable();<br />}<br />结果一运行,发现count能不断地增加,意思是它不止一次地进入中断,不知有谁知道是怎么回事?<br /><br /><br />程序的全部代码如下:#include "DSP2407A.h"<br /><br />/********* Declare Functions ******/<br /><br />typedef unsigned int uint;<br /><br />//Global functions<br />inline void Disable(void);<br />inline void Enable(void);<br />void SysInit(void);<br />void nothing(void);<br /><br />//ADC functions<br />void ADCInit(void);<br />interrupt void ADCInt(void);<br />inline void SocADC(void);<br /><br />//Global variables<br />volatile uint *j;<br />static uint adcResult[22];<br />static uint i = 0;<br />static uint count = 0;<br />/************ End ********************/<br /><br /><br />/************* main ******************/<br />int main(void)<br />{<br /> Disable();<br /> SysInit();<br /> ADCInit();<br /> Enable();<br /> SocADC();<br /> while(1);<br /> return 0;<br />}<br />/************* End of main ************/<br /><br /><br />/************* Implement of functions *******************/<br />inline void Disable(void)<br />{<br /> asm(" setc INTM");<br />}<br /><br />inline void Enable(void)<br />{<br /> asm(" clrc INTM");<br />}<br /><br />void ADCInit(void)<br />{<br /> *ADCTRL1 = 0x0000;<br /> *ADCTRL2 = 0x0600;<br /> *MAXCONV = 0x0000; //one channel to be converted<br /> *CHSELSEQ1 = 0x0000; //Channel 0<br /> *CHSELSEQ2 = 0;<br /> *CHSELSEQ3 = 0;<br /> *CHSELSEQ4 = 0;<br />}<br /><br />interrupt void ADCInt(void)<br />{<br /> //Get ADC result<br /> Disable();<br /> count++;<br /> asm(" clrc SXM");<br /> j = RESULT0;<br /> adcResult[i++] = (*j) >> 6;<br /> if (i == 22)<br /> i = 0;<br /> //*ADCTRL2 |= 0x4000;<br /> SocADC();<br /> //*IFR = *IFR | 0x0001;<br /> if (count>65534)<br /> count = 0;<br /> //Enable();<br />}<br /><br />void SysInit(void)<br />{<br /> asm(" setc SXM"); //符号扩展位有效<br /> asm(" clrc OVM"); //累加器结果正常溢出<br /> asm(" clrc CNF"); //B0被配置成数据存储空间<br /> <br /> *SCSR1 = 0x81fe;<br /> *WDCR = 0x0e8;<br /> *IMR = 0x0001; //enable INT1<br /> *IFR = 0x0ffff; //clear all interrupt flag: write a 1 clears these bits<br />}<br /><br />inline void SocADC(void)<br />{<br /> *ADCTRL2 |= 0x2000; //set SOC SEQ1<br />}<br /><br />void nothing(void)<br />{<br /> return;<br />}<br />/***************** End ********************************************/<br /><br /> |
|