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.

[参考译文] CCS/TMS320F28377D:28377D 中的 ADC_SoC_Continuous

Guru**** 2524460 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/688658/ccs-tms320f28377d-adc_soc_continuous-in-28377d

器件型号:TMS320F28377D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好。我在 controlsuite 中发现了有关 ADC_SoC_Continuous 的问题、我将通道调整为 A2、当我运行代码时、代码停止为 "while (0 = AdcRegs.ADCINTFlG.bit.ADCINT3);"、我知道 ADCINT3设置为" AdcRegs.ADCINTSEL3NSEL = bit 7.INT4;  // SOC7的末尾将设置 INT3标志。所以我无法理解代码为什么在死循环中运行。我只更改通道。车身有什么原因吗?非常感谢。

后面是代码。

//######################################################################################################################
//
//文件: adc_soc _continuous_cpu01.c
//
//标题: F2837xD 的 ADC 连续自触发。
//
//! addtogroup cpu01_example_list
//!

ADC 持续触发(ADC_SoC_Continuous)

//!
//! 此示例设置 ADC 以连续转换、从而达到最大值
//! 采样率。\n
//!
//! 程序运行后、存储器将包含:
//!
//! -\b 结果:一个模数转换采样序列
//! 从引脚 A0开始。 根据、样本之间的时间是可能的最小值
//! ADC 速度。
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
//       http://www.ti.com/ 保留所有权利$
//######################################################################################################################
//
//包含的文件
//
#include "F28x_Project.h"
//
//函数原型
//
void ConfigureADC (void);
void SetupADCContinu模糊(uint16通道);
//
//定义
//
#define Results_buffer_size 256 //缓冲区、用于存储转换结果
                //(大小必须是16的倍数)
//
//全局
//
uint16 AdcaResults[results_buffer_size];
uint16结果索引;
void main (void)
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
  InitSysCtrl();
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
  InitGpio();//针对此示例跳过
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
  Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
  InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
  IER = 0x0000;
  IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。  这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
  InitPieVectTable();
//
//配置 ADC 并为其加电
//
  ConfigureADC();
//
//在通道0上设置用于连续转换的 ADC
//
  SetupADCContinu模糊(2);
//
//启用全局中断和更高优先级的实时调试事件:
//
  EINT; //启用全局中断 INTM
  ERTM; //启用全局实时中断 DBGM
//
//初始化结果缓冲区
//
  for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)
  {
    AdcaResults[resultsIndex]=0;
  }
  resultsIndex = 0;
//
//循环无限地进行转换
//
  操作
  {
    //
    //启用 ADCINT 标志
    //
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
    AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;
    AdcaRegs.ADCINTSEL3N4.bit.INT3E = 1;
    AdcaRegs.ADCINTSEL3N4.bit.INT4E = 1;
    AdcaRegs.ADCINTFLGCLR.ALL = 0x000F;
    //
    //初始化结果索引
    //
    resultsIndex = 0;
    //
    //软件强制启动 SOC0到 SOC7
    //
    AdcaRegs.ADCSOCFRC1.ALL = 0x00FF;
    //
    //继续采样,直到结果缓冲区已满
    //
    while (resultsIndex < results_buffer_size)
    {
      //
      //等待第一组8个转换完成
      //
      while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT3);
      //
      //清除前8个转换生成的两个 INT 标志
      //
      AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
      AdcaRegs.ADCINTFLGCLR.bit.ADCINT3 = 1;
      //
      //保存前8次转换的结果
      //
      //请注意,在此期间,第二个8次转换具有
      //已被 EOC6->ADCIN1触发,将处于活动状态
      //在保存前8个结果时转换
      //
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT1;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT2;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT3;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT4;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT5;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT6;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT7;
      //
      //等待第二组8个转换完成
      //
      while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT4);
      //
      //清除第二8次转换生成的两个 INT 标志
      //
      AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
      AdcaRegs.ADCINTFLGCLR.bit.ADCINT4 = 1;
      //
      //保存第二个8次转换的结果
      //
      //请注意,在这段时间内,前8次转换具有
      //已由 EOC14->ADCIN2触发,并且将处于活动状态
      //在保存第二个8个结果时转换
      //
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT8;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT9;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT10;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT11;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT12;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT13;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT14;
      AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT15;
    }
    //
    //禁用所有 ADCINT 标志以停止采样
    //
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;
    AdcaRegs.ADCINTSEL1N2.bit.INT2E = 0;
    AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0;
    AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0;
    //
    //此时,AdcaResults[]包含一系列转换
    //从所选通道
    //
    //
    //软件断点,再次点击运行以获取更新的转换
    //
    asm (" ESTOP0");
  } while (1);
//
// ConfigureADC -写入 ADC 配置并为两者加电
//         ADC A 和 ADC B
//
空配置 ADC (空)
  EALLOW;
  //
  //写入配置
  //
  AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
  AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
  //
  //将脉冲位置设置为晚期
  //
  AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
  //
  //为 ADC 加电
  //
  AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
  //
  //延迟1ms 以允许 ADC 加电时间
  //
  DELAY_US (1000);
  EDIS;
//
// SetupADCContinuously -设置 ADC 在一个通道上持续转换
//
空设置 ADCContinuid (uint16通道)
  uint16 acqps;
  //
  //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
  //
  if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
  {
    acqps = 14;//75ns
  }
  否则、//分辨率为16位
  {
    acqps = 63;//320ns
  }
  EALLOW;
  AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC1CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC2CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC3CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC4CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC5CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC6CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC7CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC8CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC9CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC10CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC11CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC12CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC13CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC14CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC15CTL.bit.CHSEL =通道; //SOC 将在通道上转换
  AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC4CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC5CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC6CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC7CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC9CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC10CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC11CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC12CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC13CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC14CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCSOC15CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +
                        //1个 SYSCLK 周期
  AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;//禁用 INT1标志
  AdcaRegs.ADCINTSEL1N2.bit.INT2E = 0;//禁用 INT2标志
  AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0;//禁用 INT3标志
  AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0;//禁用 INT4标志
  AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;
  AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0;
  AdcaRegs.ADCINTSEL3N4.bit.INT3CONT = 0;
  AdcaRegs.ADCINTSEL3N4.bit.INT4CONT = 0;
  AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 6; // SOC6的末尾将设置 INT1标志
  AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 14;// SOC14结束将设置 INT2标志
  AdcaRegs.ADCINTSEL3N4.bit.INT3SEL = 7; // SOC7结束将设置 INT3标志
  AdcaRegs.ADCINTSEL3N4.bit.INT4SEL = 15;// SOC15结束将设置 INT4标志
  //
  //ADCINT2将触发前8个 SOC
  //
  AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC4 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC5 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC6 = 2;
  AdcaRegs.ADCINTSOCSEL1.bit.SOC7 = 2;
  //
  //ADCINT1将触发第二个8个 SOC
  //
  AdcaRegs.ADCINTSOCSEL2.bit.SOC8 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC10 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC11 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC12 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC13 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC14 = 1;
  AdcaRegs.ADCINTSOCSEL2.bit.SOC15 = 1;
  EDIS;
//
//文件结束
//
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Long、

    示例应与 ADC 通道无关。 如果您未修改运行示例、它是否仍然会卡住?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    长、

    在这方面有什么进展?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Frank,很抱歉耽误您的回复。感谢您的回复。我的主板没有测试 A0端口的条件,我只有 A2和 A3端口。 在开头。我认为即使我更改了端口,也没有影响。 ennnn,没关系。我当前的问题是 ADC+DMA。我有很长一段时间的调试。我没有找到有关28377D ADC+DMA 的一些文章。谢谢您,还有其他关于 TI 的问题吗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    长、

    没问题。 我看到您创建了另一篇关于您所看到的 ADC+DMA 问题的文章。 回到您原来的问题、出于调试目的、您实际上不必在板上提供 A0通道。 我只是想看看如果从 C2000Ware 按原样运行代码是否仍然卡住、实际转换结果对此并不重要。 如果您不再看到卡问题、请告诉我、我将关闭此主题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Frank,感谢您的参与,您可以关闭此主题,感谢您的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当然可以。 如果您有任何疑问、请告知我们。