大家好、
我将面临一个有关 ADC 的奇怪问题。 我想尽快转换温度传感器的 X 倍(在将来它将是一个模拟信号)。 因此、我启用 ADC、使用 ADC 处理程序和中断将结果放入全局变量中、我想等待我的 X 样本。 但是、即使完成了样本、我也无法使用循环来等待 X 样本的末尾。 我不明白为什么代码在采样结束后卡住。
实际上、如果我将行放在while
(adc_seq < 1000{}
主代码的末尾以等待采样结束、那么代码就会卡住。 如果我不使用该行、则它可以正常工作。 我必须确保在开始剩余代码之前完成 X 个样本、因此我必须等待。 有人有想法吗?
提前感谢
静态 int adc_seq = 0; 静态 uint32_t adc_data[1000]; void adC0seq3_Handler (void){ uint32_t ADC0Value[1]; ADCSequenceDataGet (ADC0_BASE、3、ADC0Value);//检索值。 ADC_DATA[ADC_SEQ]=(1475 -((2475 * ADC0Value[0]))/4096)/10;//数据表中的公式 VNREF 0和 VREFP 3.3全部*10以避免小数。 if (ADC_SEQ < 1000){// ADC 必须仍然工作 ADC_SEQ++; ADCIntClear (ADC0_BASE、3); } 否则{//在1000个样本后禁用 ADC ADCSequenceDisable (ADC0_BASE、3); } } void InitConvertADC (void){ SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//启用 ADC0。 while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){}//等待 ADC0就绪。 ADCSequenceDisable (ADC0_BASE,3);//序列发生器必须在 ADC0的 config:SS3之前被禁用 ADCIntDisable (ADC0_BASE、3);//禁用 ADC0中断 IntDisable (INT_ADC0SS3_TM4C129);//禁用 ADC0序列3的中断功能 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1); ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_AUSE、0);//使用 ADC0、 采样序列发生器3始终触发 ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); ADCIntClear (ADC0_BASE、3);//清除中断标志。 IntEnable (INT_ADC0SS3_TM4C129);//启用中断功能。 ADCIntEnable (ADC0_BASE、3);//启用序列发生器中断。 ADCSequenceEnable (ADC0_BASE、3);//启用序列发生器 ADC0 seq3. } int main (void) { while (ADC_SEQ < 1000){ ADC_DATA[ADC_SEQ]= 0; ADC_SEQ++; } ADC_SEQ = 0;//复位 ADC_SEQ BoardInit();//初始化板。 CONsComInit();//通过 UART0初始化与计算机的通信。 UARTprintf ("\033[2J\033[H"); UARTprintf ("test\n\n");//打印横幅 InitConvertADC(); //开始转换 while (ADC_Seq < 1000{} //如果使用此行,则代码被卡住,我再也不会走远了。 如果未使用、则可以正常工作。 UARTprintf ("\n 模数转换现已完成\n"); }