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.

[参考译文] MSP430FR5738:ADC/DMA 停止工作

Guru**** 2559970 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/611463/msp430fr5738-adc-dma-stops-working

器件型号:MSP430FR5738

大家好、

IM 使用 ADC 转换圆中的所有16个通道。 如果我的程序可以在需要时使用它、DMA 会将结果以圆的方式复制到 FRAM 中的16个连续16位寄存器。

这种情况运行良好、但不是100%。 有时、soming (ADC 或 DMA)会停止工作。 我的客户看到的是、价值保持不变。

供参考:我将 TEST-Pin 保持断开状态。 问题很少出现。 我无法重现错误。 我阅读勘误表修订版 U

希望您能帮助我重现错误并解决问题。

勘误表旁边是否存在 DMA 的已知问题?

如果我漏掉了一个字、我将尝试向您提供我能提供的任何信息。

此致

Jannes

main.c

//***** 时钟配置
//配置 ACLK = SMCLK = MCLK =~24MHz
CSCTL0_H = 0xA5;//写入密码以启用寄存器访问
CSCTL1 |= DCORSEL + DCOFSEL0 + DCOFSEL1;//设置最大值 DCO 设置

MSP430_ADC_init ();
MSP430_ADC_START ();

while (1){

}
ADC.c



/*
在 ADC-Trigger 上初始化 DMA
* DMA 监视 ADC10IFG 寄存器在位0处的上升沿。
*在每个上升沿、它会将当前的 ADC-Result 从 ADC10MEM0传输到以数组索引15开头的 ADC_Result 数组
*每次传输后、目标数组的索引将会减少、以便我们在
16次传输后用值*每行填充结果数组行 索引被复位为15、16个新值将被写入结果数组
*从位置&ADC_RESULSE[15]开始、并在传输到位置&ADC_RESULSE[0]后重新启动
*
/

void MSP430_DMA_INIT (void){

//配置 DMA0 (ADC10IFG 触发器)
DMACTL0 = DMA0TSEL_ADC10IFG;// ADC10IFG 触发
器__data16_write_addr ((无符号短整型)&DMA0SA、(无符号长整型)&ADC10MEM0);//源单地址
__data16_write_addr ((无符号短整型)无符号 DMA0DA、(long)&ADC_Result [15]);//目标数组
地址= DMA0Z // 16次转换
DMA0CTL |= DMADD_4;//重复单次传输
DMA0CTL |= DMASRCINCR_0;//源地址不变
DMA0CTL |= DMADSTINCR_2;//目标地址递减(nächstes 数组元素)
DMA0CTL &&~DMADSTBYTE; // DMA destination 是一个字
DMA0CTL &&~DMASRCBYTE; // DMA 源是一个字
DMA0CTL &=~DMALEVEL; //上升沿敏感
DMA0CTL |= DMAEN;//启用 DMA0
}

//
*使用2.0V 基准电压和10位分辨率初始化 ADC
*为 ADC 输入配置 VHI/VRX 引脚
* ADC 在 MODCLK 的第一个上升沿之后开始第一次转换, 然后、它将连续测量
* ADC 将测量一个序列中的所有 ADC 通道、完成一个序列后、它将重新启动。
*一次转换的采样保持时间为 MODCLK 的96个时钟周期
*
*使用对齐的 µC 值计算斜率和偏移温度值
*
//

void MSP430_ADC_init (void){

MSP430_DMA_init ();//初始化 DMA

ADC_PxSEL0 |= ADC_VHI_Pin + ADC_VRX_Pin;//为 ADC 输入
ADC_PxSEL1配置引脚|= ADC_VHI_Pin + ADC_VRX_Pin;//为 ADC 输入

ADC10CTL0 &=~ADC10ENC 配置引脚;//禁用 ADC10

while (REFCTL0 & REFGENBUSY);//等待参考生成器正忙
REFCTL0 |= REFVSEL_1 + REFON;//将参考电压设置为2.0V 并启用参考模块
//
ADC10MCTL0 = ADC10SREF_1 + ADC10INCH_15; //将 ADC 基准设置为 RefGenerator 并将通道15设置为最后转换的通道
ADC10CTL0 = ADC10SHT_5 + ADC10MSC + ADC10ON;// 96个 ADCclks 采样保持时间、第一个上升沿之后的多个采样和转换、启用 ADC10
ADC10CTL1 = ADC10SHP + ADC10SSEL_0 +ADC10CONSEQ_3; //采样和脉冲模式、选择 MODCLK、重复通道序列
ADC10CTL2 |= ADC10RES;//将转换分辨率设置为10位


}


//*
仅启动 ADC 转换
*/

void MSP430_ADC_start (void){
while (ADC10CTL1 & BUSY); //等待 ADC10内核处于活动状态
ADC10CTL0 |= ADC10ENC + ADC10SC; //采样和转换开始
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否已查看勘误表以了解潜在的 DMA 问题?
    www.ti.com/.../slaz391v.pdf

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

    是的。

    错误表修订版中记录的问题 u 不是问题。

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

    我看不到您发布的代码有任何问题、所有勘误表都没有描述您遇到的问题。 您提到此问题非常罕见、无法重现。 您的客户是否能够可靠地重现问题? 您的客户是否验证了 ADC 读数/DMA 传输结果与所测量引脚上的实际电压相比不正确?

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

    您是否在这个问题上取得了进一步的进展?

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

    结果不正确、但我不会获得新结果。 因此它停止刷新。

    当我们在 CCS 中使用调试模式时、我们曾遇到过类似的问题、但由于我们不再使用此模式、因此不再出现此问题。
    在这种情况下、当使用调试模式暂停微控制器时、DMA 停止工作

    或者 DMA 可能不是问题、ADC 可能不会创建新值。
    不确定。。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jannes、您好!

    这听起来与 DMA14勘误表非常相似。 您是否曾尝试从 MCLK 而不是 MODOSC 采购 ADC?

    此致、

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MODOSC 介于4.5MHz 和5.5MHz 之间
    数据表显示:当我想将 MCLK 用于10位 ADC 时、MCLK 必须介于0.45MHz 和5.5MHz 之间。
    我将使用 Div8。 ->24MHz/8 = 3MHz

    现在、我的时钟周期更长、采样保持时间更长、因此我不必增加时钟周期的数量。
    DMA 将由 ADC 触发、因此这里没有任何变化。

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

    Jannes、您好!

    您不必直接将系统 MCLK 分频。 ADC10CTL1寄存器允许您对 ADC 源时钟进行分频。 这样、它不会影响系统的其余部分。 我建议使用 ADC10DIV_4 -> 24MHz/5 = 4.8MHz

    该频率更接近 MODOSC 值、不会显著影响 ADC 时序。

    最后、要真正确认 DMA14是问题、您可以在问题发生时检查以下内容:

    1. DMA 中断是否未执行?
    2. DMASZ 寄存器的值是多少?
    3. 您使用的是 LPM 还是在工作模式下运行?
    4. ADC 溢出中断标志的值是多少? (ADC10OVIFG)

    此致、  
    Caleb Overbay

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

    您好 Caleb、

    我无法重现问题、这正是我的问题。 您能给我提供更多信息吗、了解错误发生时/发生前发生的情况。 当我了解更多信息时、或许可以进行受控设置来重现问题。 然后、我可以为您提供答案、因为现在、我只能说我们没有在 LPM 中运行。

    感谢您的

    此致

    Jannes Eilers

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

    此问题可能很难重现。 您可以尝试通过更频繁地触发 DMA 来更频繁地重现此问题、例如从一个运行到 MCLK 异步的定时器触发。 然后、如果您看到 DMA 中断停止触发并且 DMASZ 寄存器卡在非零值、您很可能会遇到此勘误表。

    此致、
    Caleb Overbay