在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采样结果存储到数组中。
问题如下:
- 触发信号是否不需要每一次启动时都设置一次,因为“AdcRegs.ADCTRL2.all = 0x2000”语句在主循环之外,并没有在主循环中,所以考虑一次启动,时时有效(在没有主动关闭的情况下)。
- while中的判断语句是等待”INT_SEQ1“为0。在ADC中当完成一个通道的转换,INT_SEQ1将会被置位为1,所以这里的等于0的条件应该是for循环中的CLR语句导致的,而此语句后仅有一个移位后赋值语句,可能机器周期数比较短,一次完整的转换还没有完成,是否正确。
- while循环后面有一个内嵌汇编语句,执行了12次NOP,请问,此过程所用的时间是不是在完成一次ADC采集。这里,到底是while循环中在做ADC采集还是asm语句在采集(似乎不是后者,因为都在忙等待,没有时间ADC采集)
所以,整个代码的思路是否是:
while循环等待一次采样完成->asm语句让采样保持->清空中断标志->读取数据
假如是以上的思路,为什么不是先将数据读取再清空中断标志呢,还是说这里的先后关系无关紧要。