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.

[参考译文] TMS320F28377S:CLA 读取 ADC 结果寄存器

Guru**** 2481465 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/695377/tms320f28377s-cla-reading-adc-result-registers

器件型号:TMS320F28377S

您好!

我有以下问题:

我无法从 CLA 内的 ADC 结果寄存器中获得正确的值

CLA 代码:

    uintptr_t* resAddrB;
    uintptr_t* resAddrD;
    resAddrB =(uint16_t *)(ADCB_BASE + ADC_O_Result1);
    resAddrD =(uint16_t *)(ADCD_BASE + ADC_O_Result1);
    cla_debug[0]=*resAddrB;
    cla_debug[1]=*resAddrD;
    

 调试窗口:

CLA_DEBUG   long[2]   [198、198]   0x000014D4@数据    
   [0]   长   整型198   0x000014D4@数据    
   [1]   长   整型198   0x000014D6@数据    
GRP( AdcbResultRegs ).REG( ADCRESULT1 )   无符号/可读、可写   23272 (十进制)    
GRP( AdcdResultRegs ).REG( ADCRESULT1 )   无符号/可读,可写   22032 (十进制)    

那么、有人建议如何解决这个问题呢?

谢谢、

EV

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

    您应该检查 uint16_t 是如何定义的。 对于 CLA、它必须是无符号短整型、而不是 int。 在 #include 中定义 是否考虑 CLA。
    将 uintptr_t 与 uint16_t *混合是危险的。 一个指定位计数、另一个不指定位计数、如何知道如何定义 uintptr_t? 至少在有关 CLA 的 stdint.h 中、它们指向相同的东西。

    Edward
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试了多个定义以使其正常工作。 但是、为了确保我还测试了以下内容:

    volatile uintptr_t* resAddrB;
    volatile uintptr_t* resAddrD;
    volatile unsigned short * ADCMem;
    ADCMem =(无符号短整型*) ADCB_BASE;
    CLA_DEBUG[2]= ADCMem[1];
    resAddrB =(uintptr_t *)(ADCB_BASE + ADC_O_Result1);
    resAddrD =(uintptr_t *)(ADCD_BASE + ADC_O_Result1);
    cla_debug[0]=*resAddrB;
    cla_debug[1]=*resAddrD;

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

    很抱歉、令人不安、我不知道 uintptr_t 的用途是什么。 但我想知道您是否正确使用了它。 首先、CLA_DEBUG 是什么、 它不清楚你从调试窗口复制了什么。

    • uintptr_t* resAddrB;  

     unitptr_t 是足够宽的 int 类型、足以存储指针。 CLA 上的指针为16位宽。 我想知道为什么您将指针声明为 int 类型、该类型的宽度足以存储指针(intptr_t)? 我认为应该在这里删除 STAR

    • uintptr_t* resAddrD;
    • resAddrB =(uint16_t *)(ADCB_BASE + ADC_O_Result1);

    然后、如果 resAddrB 声明中没有 star、 则无需对 uint16_t 的指针进行拼写 操作。 内部带有指针的 uintptr_t 会指向 ADC Result1、没问题。

    •   resAddrD =(uint16_t *)(ADCD_BASE + ADC_O_Result1);
    •   cla_debug[0]=*resAddrB;

    现在、问题是什么是 CLA_DEBUG[0]。 您是否不会将数据复制到那里。 然后使用 intptr_t resAddrB 而不使用星型、应该是

     CLA_DEBUG[0]=*(uint16_t*) resAddrB;

    这将是 intptr_t typedef 的有效用法、在 ADC 结果 N 中没有错误读取错误类型

    •   cla_debug[1]=*resAddrD;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不是指针转换专家、它真的会混淆 CLA 和 MCU 之间的指针之间的区别。
    我尝试了许多选项、并复制了我可以找到的每个示例。
    在一个示例中找到 uintptr_t、如果它产生任何不同、但没有、则使用它
    我已经使用 uint16_t 对其进行了测试

    #pragma DATA_SECTION (CLA_DEBUG、"Cla1ToCpuMsgRAM")
    volatile uint16_t CLA_debug[3];

    volatile uint16_t* resAddrB;
    volatile uint16_t resAddrD;
    resAddrB =(uint16_t *)(ADCB_BASE + ADC_O_Result1);
    resAddrD =(uint16_t *)(ADCD_BASE + ADC_O_Result1);
    CLA_DEBUG[0]=*(uint16_t*) resAddrB;
    CLA_DEBUG[1]=*(uint16_t*) resAddrB;

    结果是相同的。



    注:
    网址为 stdint.h
    typedef unsigned short uintptr_t;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您不断制造新的错误

    A)
    volatile uint16_t* resAddrB;
    volatile uint16_t* resAddrD;
    resAddrB =(uint16_t *)(ADCB_BASE + ADC_O_Result1);
    resAddrD =(uint16_t *)(ADCD_BASE + ADC_O_Result1);
    CLA_DEBUG[0]=* resAddrB;
    CLA_DEBUG[1]=* resAddrD;

    B)
    volatile uintptr_t resAddrB;
    volatile uintptr_t resAddrD;
    resAddrB =(ADCB_BASE + ADC_O_Result1);
    resAddrD =(ADCD_BASE + ADC_O_Result1);
    CLA_DEBUG[0]=*(uint16_t*) resAddrB;
    CLA_DEBUG[1]=*(uint16_t*) resAddrD;

    C)
    CLA_DEBUG[0]=*(uint16_t*)(ADCB_BASE + ADC_O_Result1);
    CLA_DEBUG[1]=*(uint16_t*)(ADCD_BASE + ADC_O_Result1);

    D)
    CLA_DEBUG[0]= AdcbResultRegs.ADCRESULT1;
    CLA_DEBUG[1]= AdcdResultRegs.ADCRESULT1;

    一切都应该正常。 您是否使用调试器验证了 ADC 结果寄存器中是否确实存在正确的数据?

    Edward
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在不起作用时不会产生新的错误。
    但您建议的所有变体都不起作用。 我认为问题在其他地方。

    我将 CCS 调试寄存器值中的寄存器值与 CLA_DEBUG 值进行比较、但结果并不相同。
    我确信 CLA 会更新它们、因为我有一个计数器来验证它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 EV:

    看起来、EK 为您提供了一些好的提示和注释。

    我相信这不会有什么不同、但您已经使用了 driverlib 文件夹中的 hw_types.h。

    被访问的定义如下所示
    #define HWREG (x) \
    (*((volatile uint32_t *)(x)))

    但这可能不是问题、因为上面发布的 EK 看起来是正确的。

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

    正如我说过的、问题不在指针投射/寻址方面。 我认为 HWREG 不适合 CLA。

    如果您知道 ADC 的工作原理、则问题非常明显。 我希望有人提前向我指出这一点。

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

    因此、您知道答案、不会告诉我们、对吧? CLA 和 ADC 没有一个问题会让我深入探究您的难题。 现在您说它是显而易见的、只会以金钱的方式显示它吗? 还不错! 我不应该尝试帮助处理不完整的请求。

    Edward
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哇哦。 我认为这对任何人都不是很有用。 但如果您想知道这一点、
    ADCB_BASE 不是 ADC 结果的正确基址寄存器:ADCBRESULT_BASE。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 显而易见但不容易被抓住。 由于您是以智能方式、花瓶、偏移等方式执行它、我认为您知道自己在做什么。 指令单步 CLA 并检查地址和读数的方式可能会更简单:-)。

    此致
    Edward