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.

[参考译文] TM4C129ENCPDT:ADC 一直处于繁忙状态

Guru**** 2614265 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/773950/tm4c129encpdt-adc-is-forever-busy

器件型号:TM4C129ENCPDT

程序永远在这个循环中[while (!ADCIntStatus (ADC0_BASE、0、false))]。 即使 ADC_0 SS0已启用、也不会生成中断。

int main()

   uint32_t ui32Value;  
   SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);  
   while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
   {

   }
   ADCSequenceDisable (ADC0_BASE、0);
   ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);
   ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_TS);
   ADCSequenceEnable (ADC0_BASE、0);
   while (1)
   {
      ADCProcessorTrigger (ADC0_BASE、0);
      while (!ADCIntStatus (ADC0_BASE、0、false))
      {

      }
      ADCSequenceDataGet (ADC0_BASE、0、\ui32Value);
   }

有什么想法我出了问题吗?

谢谢、

Sagar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sagar、

    您没有任何用于初始化 GPIO 的代码。 您也需要执行此操作、否则您选择的 ADC 引脚将不起作用。

    此外、您还需要执行 ADCIntClear (ADC0_BASE、0);这两个操作都在配置结束时(在 while 循环之前)以及在 ADCIntStatus 检查清除后进行。

    您是其中的大部分人、因此请查看 TivaWare 中的 single_ended.c 示例、以了解您需要的最后步骤。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jacobi、
    我将内部温度传感器的输出馈送到 ADC。 因此、我不必配置 GPIO。 我添加了 ADCIntClear (ADC0_BASE、0);行、但没有成功。 程序仍保持在中断轮询循环中。 这是我的更新代码。


    int main()

        uint32_t ui32Value;
        SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
        while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){}
        ADCSequenceDisable (ADC0_BASE、0);
        ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);
        ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_TS);
        ADCSequenceEnable (ADC0_BASE、0);
        ADCIntClear (ADC0_BASE、0);
        while (1)
        {
           ADCProcessorTrigger (ADC0_BASE、0);
          while (!ADCIntStatus (ADC0_BASE、0、false)){}
          ADCIntClear (ADC0_BASE、0);
          ADCSequenceDataGet (ADC0_BASE、0、\ui32Value);
        }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jacobi、

    我还尝试配置 GPIO 引脚、但没有成功。 我认为我所做的事情有根本的错误,我无法弄清楚。

    int adc_data;
    int main()

    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_ADC0))){}
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOD))){}
    GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_2);


    ADCSequenceDisable (ADC0_BASE、0);
    ADCReferenceSet (ADC0_BASE、ADC_REF_INT);
    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);
    ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH13);
    ADCSequenceEnable (ADC0_BASE、0);
    ADCIntClear (ADC0_BASE、0);
    while (1){
    ADCProcessorTrigger (ADC0_BASE、0);
    while (!ADCIntStatus (ADC0_BASE、0、false)){}
    ADCIntClear (ADC0_BASE、0);
    ADCSequenceDataGet (ADC0_BASE、0、&ADC_DATA);

    返回0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jacobi:

    将我的代码与 single_end.c 进行比较是个好主意。

    下面的行是我的代码与 single_ended.c 之间的差异

    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、20000000);

    我已将此行添加到我的代码中。 现在、ADC 显示一个中断、代码开始按预期工作。 但是、我仍然不知道系统时钟如何影响 ADC 的中断、尤其是当我仅使用处理器触发来启动 ADC 采样过程时。

    Sagar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sagar、

    老实说,我应该看到这种情况是我自己失踪的。 对于任何软件、您必须先配置系统时钟、然后再配置任何外设。 您将看到、对于我们的所有示例、系统时钟在程序开始时配置。