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/TMS320F28377S:寄存器的值稍后不会改变

Guru**** 2589245 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/661456/ccs-tms320f28377s-values-of-register-not-changing-after-sometime

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

工具/软件:Code Composer Studio

大家好、我正在使用 F28377S LaunchPad。 我正在运行 ADC 寄存器的代码。 ADC 的值存储在 adcresult0中。 寄存器窗口以连续刷新的方式运行、首先是定期更改值、但在运行1个运行时之后。 这些值在某个时间(10-20秒)内发生变化、然后即使我降低 ADC 的电压也会保持恒定。 即使我恢复或暂停程序、它也是恒定的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ashima、
    哪些值停止更改- ADC 结果寄存器或"adcresult0"?
    如果后一种情况、在值停止更改后、请尝试以下操作:
    -退出实时模式
    -在将 ADC 结果存储到"adcresult0"的代码行上放置一个断点
    -以非实时模式运行代码
    您是否达到了断点?
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    -寄存器 Adcaresultregs.ADCRESULT0的值不变,存储这些值的变量也不会改变。
    -我没有在实时模式下运行代码、它被禁用。
    -放置断点后、代码在该行停止、而不显示寄存器中的任何值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ashima、
    好的、明白了。 还有几个问题:
    -停止变化时、ADC 结果寄存器的值是多少?
    -您运行的是 TI 演示代码还是您自己的代码?
    此外、如果您可以在问题发生时附加 CCS 的屏幕截图、我们将不胜感激。 谢谢。
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     我只使用1个寄存器 adcresult0修改了演示代码 adcsoccontinuous。

    我将复制此处的代码并附上 CCS 的屏幕截图。

    //######################################################################################################################

    //

    //文件: adc_soc _continuous_cpu01.c

    //

    //标题: F2837xS 的 ADC 持续自触发。

    //

    //! addtogroup cpu01_example_list

    //!

    ADC 持续触发(ADC_SoC_Continuous)

    //!

    //! 此示例设置 ADC 以连续转换、从而达到最大值

    //! 采样率。\n

    //!

    //! 程序运行后、存储器将包含:

    //!

    //! -\b 结果:一个模数转换采样序列

    //! 从引脚 A0开始。 根据、样本之间的时间是可能的最小值

    //! ADC 速度。

    //

    //######################################################################################################################

    //$TI 版本:F2837xS 支持库 V210 $

    //$Release Date:Tue Nov1 15:35:23 CDT 2016 $

    //版权所有:版权所有(C) 2014-2016 Texas Instruments Incorporated -

    //        版权所有$

    //######################################################################################################################

    //

    //包含的文件

    //

    #include "F28x_Project.h"

    //

    //函数原型

    //

    void ConfigureADC (void);

    void SetupADCContinu模糊(uint16通道);

    //

    //定义

    //

    #define results_buffer_size 16 //缓冲区用于存储转换结果

                    //(大小必须是16的倍数)

    //

    //全局

    //

    uint16 AdcaResults[results_buffer_size];

    uint16 i;

    uint16二;

    uint16 One;

    uint16零;

    uint16 j;

    void main (void)

    //

    //步骤1. 初始化系统控制:

    // PLL、安全装置、启用外设时钟

    //此示例函数位于 F2837xS_SYSCTRL.c 文件中。

    //

      InitSysCtrl();

    //

    //步骤2. 初始化 GPIO:

    //此示例函数位于 F2837xS_GPIO.c 文件和中

    //说明了如何将 GPIO 设置为其默认状态。

    //

      InitGpio();//针对此示例跳过

    //

    //步骤3. 清除所有中断并初始化 PIE 矢量表:

    //禁用 CPU 中断

    //

      Dint;

    //

    //将 PIE 控制寄存器初始化为默认状态。

    //默认状态为禁用所有 PIE 中断和标志

    //被清除。

    //此函数位于 F2837xS_PIECTRL.c 文件中。

    //

      InitPieCtrl();

    //

    //禁用 CPU 中断并清除所有 CPU 中断标志:

    //

      IER = 0x0000;

      IFR = 0x0000;

    //

    //使用指向 shell 中断的指针初始化 PIE 矢量表

    //服务例程(ISR)。

    //这将填充整个表,即使是中断也是如此

    //在本例中未使用。  这对于调试很有用。

    //可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程

    //此函数可在 F2837xS_PieVect.c 中找到

    //

      InitPieVectTable();

    //

    //配置 ADC 并为其加电

    //

      ConfigureADC();

    //

    //在通道0上设置用于连续转换的 ADC

    //

      SetupADCContinu模糊(0);

    //

    //启用全局中断和更高优先级的实时调试事件:

    //

      EINT; //启用全局中断 INTM

      ERTM; //启用全局实时中断 DBGM

    //

     操作

      {

          EALLOW;

        //软件强制启动 SOC0

        AdcaRegs.ADCSOCFRC1.ALL = 0x0001;

          AdcaResults[i++]= AdcaResultRegs.ADCRESULT0;

        2=AdcaResultRegs.ADCRESULT0;

        for (j=0;j<10000;j++)

        {

        }

        1 = 2;

        for (j=0;j<10000;j++)

             {

             }

         零=一;

          AdcaRegs.ADCPPB1CONFIG.bit.CONFIG=0;

         AdcaRegs.ADCPPB1CONFIG.bit.TWOSCOMPEN=1;//更改符号

          AdcaRegs.ADCPPB1OFFREF=59365;//从引脚 A0和 A1处的结果中减去2.5V。

          EDIS;

      } 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 = 0; /SOC 将在通道上转换

      AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0;

      AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;  //采样窗口为 acqps +

                           //1个 SYSCLK 周期

       EDIS;

    //

    //文件结束

    //

    另外还有一个观察结果、寄存器值在首次调试时无限变化、之后停止变化。 我已重新启动 PC、然后寄存器值再次发生更改、但当再次调试时、它会产生相同的错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ashima、
    什么会阻止变量"i"计数到如此高的值、以至于代码尝试访问不存在的结果缓冲区元素? 我在代码中看不到任何用于初始化或管理该变量的内容。 请尝试添加它以查看它是否有任何变化。 谢谢。
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    感谢您的建议。 我删除了 AdcaResult 指令、现在它运行正常。 谢谢你。
    还有一件事、我尝试通过插入两个 for 循环来将寄存器的先前值存储到另一个地址中。 它工作正常。 但我能否知道它是否实际提供了之前的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ashima、
    当我最初查看代码时、我没有遵循这两个"for"循环的目的。 您似乎正在将延迟插入后台循环以允许 ADC 的采样时间、并通过计算死区来对齐新样本。 我认为随着代码的增长、这将很难保持。 实现此目的的正确方法是将 ADC 代码插入由转换结束事件触发的 ISR 中。 这样、您就可以保证每次读取都与新数据对齐、并且每次都可以保存寄存器值。
    C2000Ware 中有一个类似的示例、称为"adc_soc _ePWM_cpu01"、将向您展示如何执行此操作。
    但愿这对您有所帮助。
    此致、
    Richard