[求助] 关于MSP430FR5969的定时器触发多通道ADC转换

dwlovehome   2016-8-29 22:37 楼主
悬赏 1 分 芯积分未解决
如题,有个工程需要用到定时器触发ADC采样多路数据(为了进行FFT),然后弄了好几天,资料看了,论坛也搜了,但是好像就是不行。 以下是我自己的代码,本意是ADC进过TB0触发转换两个通道的数据,但是,仿真的时候只能进第一个中断,求助是什么问题,
  1. void IntiSysSample(void)  //ADC初始化
  2. {
  3.       //设置ADC的GPIO DEMO是A1/P1.1 A7/P2.4
  4.       GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1,GPIO_PIN1,GPIO_TERNARY_MODULE_FUNCTION);
  5.       GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P4,GPIO_PIN2,GPIO_TERNARY_MODULE_FUNCTION);
  6.       
  7.       
  8.       //设置ADCB
  9.       ADC12_B_init(     ADC12_B_BASE,
  10.                         //ADC12_B_SAMPLEHOLDSOURCE_SC,
  11.                         ADC12_B_SAMPLEHOLDSOURCE_3,
  12.                         ADC12_B_CLOCKSOURCE_SMCLK,//ADC12_B_CLOCKSOURCE_ADC12OSC,   //ADC模块时钟 参见库函数参数
  13.                         ADC12_B_CLOCKDIVIDER_1,         //分频数
  14.                         ADC12_B_CLOCKPREDIVIDER__1,     //分频数
  15.                         ADC12_B_NOINTCH);               

  16.         ADC12_B_enable(ADC12_B_BASE);                   //使能ADC
  17.       
  18.         ADC12_B_setupSamplingTimer(ADC12_B_BASE,
  19.                                    ADC12_B_CYCLEHOLD_128_CYCLES,     //ADC转换周期根据实际调整
  20.                                    ADC12_B_CYCLEHOLD_4_CYCLES,     //ADC转换周期根据实际调整  
  21.                                    ADC12_B_MULTIPLESAMPLESENABLE//ADC12_B_MULTIPLESAMPLESDISABLE //ADC12_B_MULTIPLESAMPLESDISABLE //ADC12_B_MULTIPLESAMPLESDISABLE  连续转换使能,多通道
  22.                                    );

  23.         ADC12_B_memoryConfigure(ADC12_B_BASE,
  24.                                 ADC12_B_MEMORY_0,
  25.                                 ADC12_B_INPUT_A1,
  26.                                 ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS,
  27.                                 ADC12_B_NOTENDOFSEQUENCE,//ADC12_B_ENDOFSEQUENCE,               //转换结束通道ADC12_B_NOTENDOFSEQUENCE
  28.                                 ADC12_B_WINDOW_COMPARATOR_DISABLE,
  29.                                 ADC12_B_DIFFERENTIAL_MODE_DISABLE);
  30.    
  31.          ADC12_B_memoryConfigure(ADC12_B_BASE,
  32.                                 ADC12_B_MEMORY_1,
  33.                                 ADC12_B_INPUT_A10,
  34.                                 ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS,
  35.                                 ADC12_B_ENDOFSEQUENCE,//ADC12_B_ENDOFSEQUENCE,               //转换结束通道ADC12_B_NOTENDOFSEQUENCE
  36.                                 ADC12_B_WINDOW_COMPARATOR_DISABLE,
  37.                                 ADC12_B_DIFFERENTIAL_MODE_DISABLE);
  38.         //以下是使用TIMERB的TB0的CCR1触发ADC中断
  39.         //P2.6/TB1 option select Output direction  
  40.         //TIMRB的TB0输出,用来触发ADC转换
  41.        //GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);
  42.        //Start timer
  43.         TIMER_B_configureUpMode(TIMER_B0_BASE,
  44.                                 TIMER_B_CLOCKSOURCE_SMCLK,
  45.                                 TIMER_B_CLOCKSOURCE_DIVIDER_1,
  46.                                 511,
  47.                                 TIMER_B_TBIE_INTERRUPT_DISABLE,
  48.                                 TIMER_B_CCIE_CCR0_INTERRUPT_DISABLE,
  49.                                 TIMER_B_DO_CLEAR
  50.                                 );
  51.         TIMER_B_startCounter(TIMER_B0_BASE,
  52.                              TIMER_B_UP_MODE
  53.                              );

  54.         //Initialize compare mode to generate PWM1
  55.         TIMER_B_initCompare(TIMER_B0_BASE,
  56.                             TIMER_B_CAPTURECOMPARE_REGISTER_1,
  57.                             TIMER_B_CAPTURECOMPARE_INTERRUPT_DISABLE,
  58.                             TIMER_B_OUTPUTMODE_RESET_SET,
  59.                             383
  60.                          );
  61.         //最后开启ADC转换中断
  62.         ADC12_B_clearInterrupt(ADC12_B_BASE,
  63.                                0,
  64.                                ADC12_B_IFG0|ADC12_B_IFG1
  65.                                );
  66.         //Enable memory buffer 0 interrupt
  67.         ADC12_B_enableInterrupt(ADC12_B_BASE,
  68.                                 ADC12_B_IE0|ADC12_B_IE1,
  69.                                 0,
  70.                                 0);
  71.         __delay_cycles(75);                   // reference settling ~75us
  72.         
  73.        ADC12_B_startConversion(ADC12_B_BASE,ADC12_B_MEMORY_0,
  74.                               // ADC12_B_REPEATED_SINGLECHANNEL
  75.                                  ADC12_B_REPEATED_SEQOFCHANNELS
  76.                                  );
  77.       __bis_SR_register(GIE);
  78. }

  1. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  2. #pragma vector=ADC12_VECTOR
  3. __interrupt
  4. #elif defined(__GNUC__)
  5. __attribute__((interrupt(ADC12_VECTOR)))
  6. #endif
  7. void ADC12_ISR(void)
  8. {
  9.         
  10.        switch (__even_in_range(ADC12IV, 12)) {
  11.         case  0: break;                         // Vector  0:  No interrupt
  12.         case  2: break;                         // Vector  2:  ADC12BMEMx Overflow
  13.         case  4: break;                         // Vector  4:  Conversion time overflow
  14.         case  6: break;                         // Vector  6:  ADC12BHI
  15.         case  8: break;                         // Vector  8:  ADC12BLO
  16.         case 10: break;                         // Vector 10:  ADC12BIN
  17.         case 12:                                // Vector 12:  ADC12BMEM0 Interrupt
  18.                 if (ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x6B4)
  19.                 {
  20.                         //Set P1.0 LED on
  21.                         GPIO_setOutputHighOnPin(
  22.                                 GPIO_PORT_P1,
  23.                                 GPIO_PIN0
  24.                                 );
  25.                 }
  26.                 else {
  27.                         //Set P1.0 LED off
  28.                         GPIO_setOutputLowOnPin(
  29.                                 GPIO_PORT_P1,
  30.                                 GPIO_PIN0
  31.                                 );
  32.          
  33.                 }
  34.              ADC12IFGR0 &= ~ADC12IFG0;
  35.               //  __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
  36.                 break;                                  // Clear CPUOFF bit from 0(SR)
  37.         case 14: {
  38.              //      __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
  39.            if (ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_1) >= 0x6B4) {
  40.                         //Set P1.0 LED on
  41.                         GPIO_setOutputHighOnPin(
  42.                                 GPIO_PORT_P1,
  43.                                 GPIO_PIN0
  44.                                 );
  45.                 }else  {
  46.                         //Set P1.0 LED off
  47.                         GPIO_setOutputLowOnPin(
  48.                                 GPIO_PORT_P1,
  49.                                 GPIO_PIN0
  50.                                 );
  51.                 }
  52.            ADC12IFGR1 &= ~ADC12IFG1;
  53.           }break;                                 // Vector 14:  ADC12BMEM1
  54.         case 16: break;                                 // Vector 16:  ADC12BMEM2
  55.         case 18: break;                                 // Vector 18:  ADC12BMEM3
  56.         case 20: break;                                 // Vector 20:  ADC12BMEM4
  57.         case 22: break;                                 // Vector 22:  ADC12BMEM5
  58.         case 24: break;                                 // Vector 24:  ADC12BMEM6
  59.         case 26: break;                                 // Vector 26:  ADC12BMEM7
  60.         case 28: break;                                 // Vector 28:  ADC12BMEM8
  61.         case 30: break;                                 // Vector 30:  ADC12BMEM9
  62.         case 32: break;                                 // Vector 32:  ADC12BMEM10
  63.         case 34: break;                                 // Vector 34:  ADC12BMEM11
  64.         case 36: break;                                 // Vector 36:  ADC12BMEM12
  65.         case 38: break;                                 // Vector 38:  ADC12BMEM13
  66.         case 40: break;                                 // Vector 40:  ADC12BMEM14
  67.         case 42: break;                                 // Vector 42:  ADC12BMEM15
  68.         case 44: break;                                 // Vector 44:  ADC12BMEM16
  69.         case 46: break;                                 // Vector 46:  ADC12BMEM17
  70.         case 48: break;                                 // Vector 48:  ADC12BMEM18
  71.         case 50: break;                                 // Vector 50:  ADC12BMEM19
  72.         case 52: break;                                 // Vector 52:  ADC12BMEM20
  73.         case 54: break;                                 // Vector 54:  ADC12BMEM21
  74.         case 56: break;                                 // Vector 56:  ADC12BMEM22
  75.         case 58: break;                                 // Vector 58:  ADC12BMEM23
  76.         case 60: break;                                 // Vector 60:  ADC12BMEM24
  77.         case 62: break;                                 // Vector 62:  ADC12BMEM25
  78.         case 64: break;                                 // Vector 64:  ADC12BMEM26
  79.         case 66: break;                                 // Vector 66:  ADC12BMEM27
  80.         case 68: break;                                 // Vector 68:  ADC12BMEM28
  81.         case 70: break;                                 // Vector 70:  ADC12BMEM29
  82.         case 72: break;                                 // Vector 72:  ADC12BMEM30
  83.         case 74: break;                                 // Vector 74:  ADC12BMEM31
  84.         case 76: break;                                 // Vector 76:  ADC12BRDY
  85.         default: break;
  86.         }
  87. }
  1. void main(void)
  2. {
  3.   //Stop Watchdog Timer
  4.    WDT_A_hold(WDT_A_BASE);
  5.    SysClockInit();
  6.   //Set P1.0 to output direction
  7.    GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
  8.         
  9.    GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);        //输出高
  10.    PMM_unlockLPM5();               //调用IO口输出时需要此举
  11.    IntiSysSample();
  12.      
  13.   while(1)
  14.   {
  15.     TestADCSplasss();
  16.   }
  17. }


回复评论 (2)

还不如直接传个工程,看不到定时器中断。。
点赞  2016-8-30 17:02

你的时钟呢,你的问题是第一行说了4.2口A7,但是在ADC12_b_memoryconfigure模拟输入的时候又是A10口输入,采集的端口不对,所以采集不到

本帖最后由 1070445044 于 2019-8-3 21:31 编辑
点赞  2019-8-3 21:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复