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.

[参考译文] MSP430F6736A:使用 UART 的 DMA 的 TX

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1077307/msp430f6736a-tx-using-dma-from-uart

部件号:MSP430F6736A
《线程》中讨论的其他部件: MSP430F6734AMSPWARE

大家好,团队

请检查以下请求并提供建议吗?

"

我们在项目中使用 MSP430F6736A 和 MSP430F6734A 处理器,但 UART 通信出现问题。
我们正在尝试使用 UART 端口的 DMA 进行 TX,但它的工作非常不稳定。 就我在调试时所见,DMA 会发送数据包的前几个字节并开始等待。 DMA0SZ (DMA0传输大小)正在等待,没有零,也没有调用 DMA 中断。
当处理器在此状态下运行时,当您暂停并进入调试器时,DMA 有时会从其关闭的位置继续,当 DME0SZ 为0时,会调用中断。
是否可以共享可用于这些处理器的样本 UART DMA TX 代码?

我在项目中使用 MSP430 DriverLib 2.91。
当我在 MSPWare 中尝试 UART 示例时,我发现程序无法通过__bis_SR_register (LPM0_bits + GIE)行。 设备无法切换至 LPM0。 当我们继续操作而不切换到 LPM0时,我们也会遇到同样的问题。 DMA 发送几个字节并等待。 暂停并继续使用调试器时,它会再发送几个字节。
我们发现 MSP430F6734A 处理器中的行为也是如此。
我们无法切换到 LPM0的原因可能是什么?
DMA 问题是否也可能由这种情况引起?
我们使用的卡为处理器提供3.3V 电压,如示例所示,从 Xin-XOUT 引脚使用32kHz 晶体。

"

请提前感谢

此致

福尔坎·塞菲洛格鲁

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

    DMA 似乎不太可能停止运行,因此还有其他问题要处理。 从他们的描述看,我认为他们真的不理解什么。  程序未能通过 BIS_SR 指令并不是因为未能进入 LPM0,而是因为未能进入 LPM0并未能离开。

    如果没有违规代码,就不能说更多了。 这几乎肯定是问题的原因。

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

    大卫,你好。

    请参阅随函附上的信息吗?

    e2e.ti.com/.../136016.main.c

    请提前感谢

    此致

    福尔坎·塞菲洛格鲁

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

    此代码永远不会到达您设置低功耗模式的位置:

      while(1){
          uartSendStringDMA(testStr2);
      }
    

    我认为这是正常的,因为没有代码可以退出低功耗模式。

    您还可能与使用 UCA2TXBUF 有冲突。 由 DMA 和 UART ISR 使用。 在这里,麻烦的可能性是无穷无尽的。

    除非使用外部触发源,否则建议使用边缘触发器。 尽管这意味着您必须采取措施来启动流程并 在 TXIFG 上创造第一个优势。

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

    大卫,你好。

    这是 main.c 的一部分,程序在电源模式更改时卡住。 您收到的代码用于测试 DMA 行为。

    int main(void)
    {
      WDTCTL = WDTPW | WDTHOLD;                
    
      initGPIO();
      increaseVCoreToLevel2();
      initClockTo16MHz();
      initUART();
      __bis_SR_register(LPM0_bits + GIE); // STUCK HERE
      while(1){
          uartSendStringDMA(testStr2);
      }
    }

    我看不出    UCA2TXBUF 在哪里 使用,但在测试期间没有故意 RX,因此不应该调用 UART ISR。 我正在尝试发送一个 constatnt 字符串。

    还有什么可以澄清的吗?

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

    除了在执行任何操作之前进入低功耗模式外, DMA ISR 中没有任何内容可以退出低功耗模式。

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

    示例中有低功耗模块代码,现在没有必要使用。  

    DMA 暂停的原因可能是什么? 您能看到什么原因。

    在这种情况下,主要功能就是这样的;

    int main(void)
    {
      WDTCTL = WDTPW | WDTHOLD;                 // Stop Watchdog
    
      initGPIO();
      increaseVCoreToLevel2();
      initClockTo16MHz();
      initUART();
      __enable_interrupt();
      while(1){
          uartSendStringDMA(testStr2);
      }
     }

    当我将 CPU 设置为8MHz 时,我看到同样的行为,并且不会更改 VCORE 级别。  

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

    如何使用软件触发 DMA?