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.

[参考译文] MSP430FR5989:ADC12TOVIFG 恢复问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/600622/msp430fr5989-adc12tovifg-recovery-issues

器件型号:MSP430FR5989

您好!

我已经有一段时间尝试从 ADC 转换时间溢出中恢复。  我的问题不在于我收到错误、而是尝试从错误中恢复。  我故意将采样率设置为比支持的速率更快、从而强制转换时间溢出标志。  但是、在我得到该误差后、无论采样率设置多么慢、它始终会生成该误差、直到我对电路板进行下电上电。

我已经对其进行了设置、以便 TimerB0馈入 ADC 模块、然后再馈入 DMA 模块。  我怀疑问题是在我收集了我所需的所有样本后、我花了太长的时间来停止计时器、然后触发另一个我强制停止的转换。  

我使用以下代码强制停止收集。  我认为这符合用户指南中的建议:

ADC12CTL1 &=~(ADC12CONSEQ_3);//根据用户指南、要停止任何转换、需要清除这3个位
ADC12CTL0 &=~(ADC12ENC);//需要先禁用转换、然后才能更改任何其他位
while (ADC12CTL1和 ADC12BUSY);
ADC12CTL0 &=~(ADC12ON);
TB0CTL &=~MC_3;

我的逻辑或操作顺序是否存在任何明显的缺陷?

谢谢、

Chris

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

    尊敬的 Chris:

    您可能会遇到 ADC42勘误表。 您能否查看此勘误表及其权变措施、并告诉我它们是否能解决您的问题?

    此致、

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Caleb 的回应。 我还怀疑此勘误表可能是问题原因。 我遇到错误的事实并不是问题、因为一旦发生错误、我似乎无法从错误中恢复。

    勘误表似乎表明以下步骤将从此恢复:

    要恢复转换暂停:
    1、禁用 ADC 模块(ADC12CTL0.ADC12ENC = 0和 ADC12CTL0.ADC12ON = 0)
    2.重新启用 ADC 模块(ADC12CTL0.ADC12ON = 1且 ADC12CTL0.ADC12ENC =
    1)
    3.重新使能转换

    我认为我正在按照这些步骤关闭模块、但我不相信我正在正确地执行该模块:

    ADC12CTL1 &=~(ADC12CONSEQ_3);//根据用户指南、要停止任何转换、需要清除这3个位
    ADC12CTL0 &=~(ADC12ENC);//需要先禁用转换、然后才能更改任何其他位
    while (ADC12CTL1和 ADC12BUSY);
    ADC12CTL0 &=~(ADC12ON);
    TB0CTL &=~MC_3;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chris:

    您不会执行上述步骤。 我建议如下:

    ADC12CTL1 &=~(ADC12CONSEQ_3); //复位为单通道模式
    ADC12CTL0 &=~(ADC12ENC + ADC12ON);//复位 ENC 和 ON 位
    TB0CTL &=~MC_3; //停止计时
    器 ADC12CTL0 |= ADC12ENC + ADC12ON;//设置 ENC 和 ON 位 

    它与您以前的情况没有太大不同。 我复位同一行代码中的 ENC 和 ON 位、然后在后面进行设置。 不需要在 BUSY 位上挂起。 如果对进行了优化、编译器可能会看到您稍后在代码中设置 ENC 和 ON 位并优化掉复位。 注意拆卸过程、检查是否存在这种情况。

    此外、当中断被处理时、ADC12TOVIFG 应该被复位。 当问题发生时、您能否再次检查是否清除了此标志?

    此致  

    Caleb Overbay

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

    不幸的是,这对我来说是行不通的。  但是、当我在调试器上观察到这些差异时、我发现了这一点

    ADC12CTL0 &=~(ADC12ENC + ADC12ON); 

    调试器指示 ADC12ON 位实际上没有清零。  此外、如果我这么做的话  

    ADC12CTL0 &=~(ADC12ENC);
    ADC12CTL0 &=~(ADC12ON); 

    调试器指示两个位都已清除。  不确定这是否有用、但我确实觉得奇怪。

    尽管如此、我仍然遇到这样一个问题:一旦我获得溢出、我就无法从它恢复、并且无论何时我尝试获取另一个样本、它都会立即再次溢出。

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

    您能否发布重现问题的精简代码集? 我想在我的设置中测试这个。

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

    你好 Caleb。

    首先、我要再次感谢您花时间帮助我。

    我要附加一些我生成的示例代码、这些代码会重新创建我遇到的此错误。  为了概述(尝试)要实现的目标、我尝试尽可能快地"同时"对2个模拟通道进行采样。  再说一次、我不介意如果我们最终导致溢出发生得太快、但这是一个大问题、一旦发生、我似乎无法从错误中恢复。

    在该项目中、我首先以太快的采样方式开始。  我获得溢出标志、因此我将速率更改为低得多的速率(我知道足够慢、模块可以跟上)。  但是、在降低该速率后、我仍然会得到持续溢出中断(即使标志被清除并且 ADC 模块正在复位)。  

    设置如下。  我有 TB0.1馈送 ADC 模块。  ADC 模块设置为扩展采样模式、因此计时器会在每个通道采样时驱动多长时间。  我设置了2个 DMA、每个 DMA 用于将数据从其中一个 ADC12MEMx 寄存器传输到缓冲器中。  我通过实验(和研究)发现 ADC12IFG 无法触发两个模块、因此我设置计时器以同时触发 DMA 模块(在本例中、我意识到触发太快、 但这只是为了证明我在溢出发生后无法从溢出中恢复)。  此外、TimerB0和 ADC 模块运行 SMCLK (8MHz)。  

    再次感谢、

    Chris

    e2e.ti.com/.../7167.main.c

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

    您好 Caleb、

    我只是想检查一下、看看您是否有机会查看我遇到的问题和/或我是否可以提供任何其他帮助?

    Chris

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

    Caleb 正在休假、在6/19之前不会回复 E2E 帖子。

    首先、MPU 寄存器只能在给出正确的密码后才能访问、因此我建议您设置 MPUCTL0 = MPUPW;在改变 MPUSAM 之前和之后(您可能已经在 CCS 工程属性的 MSP430 MPU 选项卡中更改此设置)。 我还观察到、如果将 MODOSC 或 SMCLK/2用作 ADC 时钟源而不是 SMCLK、则不会出现此问题。数据表确实指出、针对指定性能的最大 ADC 时钟频率为5.4MHz。 这种高输入频率可能会影响内部 ADC 采样和转换器机器。

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

    Ryan 的建议是否能够让事情回到正轨?

    此致、
    Caleb Overbay