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.

[参考译文] TMS570LC4357:被 Halcogen 生成的 adcGetData (从 GxINTCR 计算计数)混淆

Guru**** 2451970 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223605/tms570lc4357-confused-by-halcogen-generated-adcgetdata-calculated-count-from-gxintcr

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我将使用由 PWM SOCA 触发的 ADC、而不是在连续转换模式下。

我已经在此处设置了 HALCoGen

生成的代码

uint32 adcGetData(adcBASE_t *adc, uint32 group, adcData_t * data)
{
    uint32  i;
    uint32  buf;
    uint32  mode;    
    uint32  index = (adc == adcREG1) ? 0U : 1U;
	
	uint32  intcr_reg = adc->GxINTCR[group];
    uint32  count = (intcr_reg >= 256U) ? s_adcFiFoSize[index][group] : (s_adcFiFoSize[index][group] - (uint32)(intcr_reg & 0xFFU));
    adcData_t *ptr = data; 

/* USER CODE BEGIN (16) */
/* USER CODE END */

在代码执行期间、我得到的是实际的负结果:

为什么会这样呢? 这是一个错误、还是我应该只直接从 ADC 缓冲器访问 ADC 结果?

谢谢

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

    尊敬的 Hongbo:

    我们已着手解决您的问题、并将很快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Hongbo:

    在代码执行期间、我得到的是实际的负结果:

    [/报价]

    "count"变量被声明为 uint32 (unsigned int)、那么如何为 count 获得负值?

    --

    谢谢。此致、
    Jagadish。

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

    您看到计数结果了吗? 4294967119的计算公式为7 - 184 -> uint32_t

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

    尊敬的 Hongbo:

    很抱歉更新出现延迟。

    调试后、我了解这可能是调试问题。

    实际上、如果我们设置任何断点"adcNotification "和"adcGetData"函数、您会看到该计数值为负数。 这是因为即使在我们使用断点暂停调试后 ETPWM 也不会停止、即使它到达断点、PWM 也会生成、并且会再次触发 ADC 进行转换。 在您的情况下、您将在转换开始前将"GxINTCR"值设置为7、因此如果转换次数大于7、则寄存器值将递减到小于零。

    例如:

    在本例中、我刚选择了3个通道、并添加了停止 PWM 信号的注释  

    在我的示例中 GxINTCR 的初始值是16、 现在您可以看到  GxINTCR 的值变成了 0xFFD0。

    现在我只停止 PWM 信号、想要查看 GxINTCR 值:

    现在您可以看到、我刚刚用0x10初始化 GxINTCR、GxINTCR 停止在 0x0D、这意味着3次转换之后恰好是如此。 因此、在本例中、如果我进一步调试、我可以看到计数值为3。

    我还可以解释为什么我在第一个案例中得到了 oxFFD0、这是因为实际上我已经初始化了具有64个缓冲器的1组、所以溢出将在64次转换后发生、所以 ADC 将开始转换至64次转换。

    当我 立即用0x10初始化 GxINTCR 时、16次转换后、该寄存器值将变为0、如果 ADC 进行下一次转换、则该寄存器值将变为-1、这意味着0xFFFF、 对于下一次转换、该寄存器值变为0xFFFE、表示-2、此过程将继续到-48 (共64次转换)、表示0xFFD0 。

    我希望这会澄清你的疑问。

    --

    谢谢。此致、
    Jagadish。

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

    感谢您的详细解释