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.

关于 Example_281xAdcSeqModeTest 示例的疑问



在TI官方提供的示例中,main函数中有以下语句:

// Start SEQ1
   AdcRegs.ADCTRL2.all = 0x2000;

   // Take ADC data and log the in SampleTable array  
   while(1)
   {  
     for (i=0; i<AVG; i++)
     {
        while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt
        // Software wait = (HISPCP*2) * (ADCCLKPS*2) * (CPS+1) cycles
        //               = (3*2)      * (1*2)        * (0+1)   = 12 cycles
        asm(" RPT #11 || NOP");
        AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
        SampleTable[i] =((AdcRegs.ADCRESULT0>>4));
     }
   }

其中,AdcRegs.ADCTRL2.all = 0x2000;为启动SEQ1转换通道的触发信号。然后进入主循环,在循环中,当中断标志位为0时,等待12个时钟周期后,将ADC采样结果存储到数组中。

问题如下:

  1. 触发信号是否不需要每一次启动时都设置一次,因为“AdcRegs.ADCTRL2.all = 0x2000”语句在主循环之外,并没有在主循环中,所以考虑一次启动,时时有效(在没有主动关闭的情况下)。
  2. while中的判断语句是等待”INT_SEQ1“为0。在ADC中当完成一个通道的转换,INT_SEQ1将会被置位为1,所以这里的等于0的条件应该是for循环中的CLR语句导致的,而此语句后仅有一个移位后赋值语句,可能机器周期数比较短,一次完整的转换还没有完成,是否正确。
  3. while循环后面有一个内嵌汇编语句,执行了12次NOP,请问,此过程所用的时间是不是在完成一次ADC采集。这里,到底是while循环中在做ADC采集还是asm语句在采集(似乎不是后者,因为都在忙等待,没有时间ADC采集)

所以,整个代码的思路是否是:

while循环等待一次采样完成->asm语句让采样保持->清空中断标志->读取数据

假如是以上的思路,为什么不是先将数据读取再清空中断标志呢,还是说这里的先后关系无关紧要。