This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430f5438A,adc采样保持源选用timer

Other Parts Discussed in Thread: MSP430F5438A

MCU选用MSP430F5438A,系统主频为18.432MHz,adc采样保持源选用01 Timer_A.OUT1时,单片机无法采样,代码如下:

#include "msp430x54x.h"

__no_init int Volt[1200];      //ADC转换电压 40个周期

__no_init int Crrnt[1200];    //ADC转换电流  40个周期

int Jizhun[10];

int DMAcount;

void Init_DMA()

{     

DMACTL0 = DMA0TSEL_24+DMA1TSEL_24;                  // ADC12IFGx triggered     

 DMACTL1 = DMA2TSEL_24;     

DMACTL4 = DMARMWDIS;                      // Read-modify-write disable       

DMA0CTL &= ~DMAIFG;       

 DMA1CTL &= ~DMAIFG;     

 DMA2CTL &= ~DMAIFG;     

DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst, int

DMA1CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst,int     

DMA2CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, inc dst,     

 DMA0SZ = 1200;                               // DMA0 size = 12 00   

DMA1SZ = 10;     

DMA2SZ = 1200;     // DMA2SZ = 1200;          

 __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM13);   // ... from ADC12MEM13

 __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &Volt);

 __data16_write_addr((unsigned short) &DMA1SA,(unsigned long) &ADC12MEM12);   // ... from ADC12MEM14     

 __data16_write_addr((unsigned short) &DMA1DA,(unsigned long) &Jizhun);

__data16_write_addr((unsigned short) &DMA2SA,(unsigned long) &ADC12MEM15);   // ... from ADC12MEM14     

__data16_write_addr((unsigned short) &DMA2DA,(unsigned long) &Crrnt);

 }

void main(void)

{  

WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗    

P7SEL     |= 0x03;    

P5SEL     |= 0x0C                                       ; // 端口功能选择振荡器  

UCSCTL6   &= ~XT2OFF                                    ;  

UCSCTL3   |= SELREF_2                                   ; 

UCSCTL4   |= SELA_0                                     ;

do   {    

UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                             

SFRIFG1 &= ~OFIFG                                     ;  

 }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志  

 UCSCTL6   |= XT2DRIVE0 + XT2DRIVE1                      ; // XT2 驱动模式 24~32MHz                                             

UCSCTL4   |= SELS_5 + SELM_5                            ; // SMCLK = MCLK = XT2  

 //蓝色字体部分,系统时钟初始化,系统时钟18.432Mhz   

P5SEL|=BIT0+BIT1;  

P5DIR&=~(BIT0+BIT1);    //ADC参考电压为外部参考电压3V

 P7SEL      |= BIT7+BIT4+BIT5                                    ; // Enable A/D channel A13,12,15  

 P8SEL|=BIT1;  

 P8DIR |= BIT1;  

P6DIR|=BIT3;    

 _EINT();    

Init_DMA();    

TA0CCR0=4607;  

 TA0CCR1=4000;  

 TA0CCTL1 = OUTMOD_3;                       // Toggle on EQU1 (TAR = 0)  

 TA0CTL = TASSEL_2 + MC_1+TACLR;                  // SMCLK, cont-mode     

 ADC12CTL0 = ADC12SHT0_2  + ADC12ON ; // Config ADC12  

ADC12CTL1 = ADC12SHS_1  + ADC12CONSEQ_3 +ADC12SHP+ADC12CSTARTADD_12;       // TA trig., rpt conv.+ ADC12SHP  

 ADC12MCTL13  = ADC12SREF_2+ ADC12INCH_13                 ; // Vr+=Vref+ and Vr-=AVss  

ADC12MCTL12  = ADC12SREF_2+ ADC12INCH_12                 ; // Vr+=Vref+ and Vr-=AVss  

ADC12MCTL15  = ADC12SREF_2+ ADC12INCH_15 +ADC12EOS               ; // Vr+=Vref+ and Vr-=AVss   

 ADC12CTL0 |=ADC12ENC;   

   while(1)  

 {     ;   }

}

//////////////////DMA中断函数

 #pragma vector=DMA_VECTOR

 __interrupt void DMA_ISR(void)

 {  

switch(__even_in_range(DMAIV,16))  

{    

 

case 0: break;    

 case 2:  break;                               // DMA0IFG = DMA Channel 0                 

case 4: break;                           // DMA1IFG = DMA Channel 1                                                

 case 6:                 

DMAcount=0;          

P6OUT^=BIT3;                                          // 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;  

  }

}

MCU选用MSP430F5438A,系统主频为18.432MHz,adc采样保持源选用03 Timer_B.OUT1时,单片机正常采样,并且正确,代码如下:

#include "msp430x54x.h"

__no_init int Volt[1200];      //ADC转换电压 40个周期

__no_init int Crrnt[1200];    //ADC转换电流  40个周期

int Jizhun[10];

int DMAcount;

void Init_DMA()

{     

DMACTL0 = DMA0TSEL_24+DMA1TSEL_24;                  // ADC12IFGx triggered    

DMACTL1 = DMA2TSEL_24;     

DMACTL4 = DMARMWDIS;                      // Read-modify-write disable       

DMA0CTL &= ~DMAIFG;      

DMA1CTL &= ~DMAIFG;    

DMA2CTL &= ~DMAIFG;     

DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst, int

DMA1CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst,int     

DMA2CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, inc dst,

DMA0SZ = 1200;                               // DMA0 size = 12 00   

DMA1SZ = 10;     

DMA2SZ = 1200;     // DMA2SZ = 1200;         

__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM13);   // ... from ADC12MEM13

__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &Volt);

__data16_write_addr((unsigned short) &DMA1SA,(unsigned long) &ADC12MEM12);   // ... from ADC12MEM14    

__data16_write_addr((unsigned short) &DMA1DA,(unsigned long) &Jizhun);

__data16_write_addr((unsigned short) &DMA2SA,(unsigned long) &ADC12MEM15);   // ... from ADC12MEM14     

__data16_write_addr((unsigned short) &DMA2DA,(unsigned long) &Crrnt);

}

void main(void)

{  

WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗    

P7SEL     |= 0x03;    

P5SEL     |= 0x0C                                       ; // 端口功能选择振荡器  

UCSCTL6   &= ~XT2OFF                                    ;  

UCSCTL3   |= SELREF_2                                   ; 

UCSCTL4   |= SELA_0                                     ;

do   {    

UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                             

SFRIFG1 &= ~OFIFG                                     ; 

}while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志 

UCSCTL6   |= XT2DRIVE0 + XT2DRIVE1                      ; // XT2 驱动模式 24~32MHz                                             

UCSCTL4   |= SELS_5 + SELM_5                            ; // SMCLK = MCLK = XT2 

//蓝色字体部分,系统时钟初始化,系统时钟18.432Mhz   

P5SEL|=BIT0+BIT1;  

P5DIR&=~(BIT0+BIT1);    //ADC参考电压为外部参考电压3V

P7SEL      |= BIT7+BIT4+BIT5                                    ; // Enable A/D channel A13,12,15 

P4SEL|=BIT1; 

P4DIR |= BIT1;  

P6DIR|=BIT3;   

_EINT();    

Init_DMA();    

TB0CCR0=4607; 

TB0CCR1=4000; 

TB0CCTL1 = OUTMOD_3;                       // Toggle on EQU1 (TAR = 0) 

TB0CTL = TBSSEL_2 + MC_1+TBCLR;                  // SMCLK, cont-mode    

ADC12CTL0 = ADC12SHT0_2  + ADC12ON ; // Config ADC12  

ADC12CTL1 = ADC12SHS_3  + ADC12CONSEQ_3 +ADC12SHP+ADC12CSTARTADD_12;       // TA trig., rpt conv.+ ADC12SHP 

ADC12MCTL13  = ADC12SREF_2+ ADC12INCH_13                 ; // Vr+=Vref+ and Vr-=AVss  

ADC12MCTL12  = ADC12SREF_2+ ADC12INCH_12                 ; // Vr+=Vref+ and Vr-=AVss  

ADC12MCTL15  = ADC12SREF_2+ ADC12INCH_15 +ADC12EOS               ; // Vr+=Vref+ and Vr-=AVss  

ADC12CTL0 |=ADC12ENC;  

   while(1) 

{     ;   }

}

//////////////////DMA中断函数

#pragma vector=DMA_VECTOR

__interrupt void DMA_ISR(void)

{  

switch(__even_in_range(DMAIV,16))  

{    

case 0: break;   

case 2:  break;                               // DMA0IFG = DMA Channel 0                 

case 4: break;                           // DMA1IFG = DMA Channel 1                                               

case 6:                 

DMAcount=0;          

P6OUT^=BIT3;                                          // 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;  

  }

}

问题:采样保持源选择timer时,timerA和timerB设置有什么不同吗?

01 Timer_A.OUT1

10 Timer_B.OUT0

11 Timer_B.OUT1