简单描述一下情况,中断是DMA的中断,在DMA子程序里我实现的功能是用TimerA触发ADC12然后将ADC12MEM0转存到RAM,中断里写的是,停止TimerA和ADC12并将ADC12转换的2000个值稍作处理后显示在LCD上,先附上简略代码:
void ADC12_DMA(void){
WDTCTL = WDTPW + WDTHOLD; // Stop watch dog timer
P6SEL |= 0x40; // Enable A/D channel A6
P1SEL |= BIT2; // P1.2/TA1 option select
P1DIR |= BIT2; // Output direction
//Setup Timer B0
……
// Setup ADC12
……
// Setup DMA0
……
DMA0SZ = 2000; // DMA0 size = 2000
__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM0);
// Source block address
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) DMA_DST);
// Destination single address
__bis_SR_register(LPM0_bits + GIE); // LPM0 w/ interrupts
__no_operation(); // used for debugging
}
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
{
switch(__even_in_range(DMAIV,16))
{
case 0: break;
case 2: // DMA0IFG = DMA Channel 0
TA0CTL = MC_0+TACLR; // Stop TimerB
ADC12CTL0 &= ~ADC12ENC; // Reset ENC to stop ADC12
……
break;
case 4: break; // DMA1IFG = DMA Channel 1
case 6: break; // DMA2IFG = DMA Channel 2
case 8: break; // DMA3IFG = DMA Channel 3
case 10: break; // DMA4IFG = DMA Channel 4
case 12: break; // DMA5IFG = DMA Channel 5
case 14: break; // DMA6IFG = DMA Channel 6
case 16: break; // DMA7IFG = DMA Channel 7
default: break;
}
}
主程序中是要循环执行ADC12_DMA(),但是发现退不出中断,无法回到主程序
void main(){
……
while(1){
do{
ADC12_DMA();
Dogs102x6_stringDraw(6, 0, "Next TEST", DOGS102x6_DRAW_INVERT);
Dogs102x6_stringDraw(7, 0, "Press S1 | S2", DOGS102x6_DRAW_NORMAL);
}while(buttonsPressed);
}
}
请问这样的问题怎么破?(用的是MSP-EXP430F5529)
Thanks
Zhenting Liu:
中断结束,退出低功耗模式
灰小子:
在中断服务程序里,退出低功耗模式就可以了