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.

[参考译文] CCS/MSP430F1611:使用 DMA 传输 UART 数据

Guru**** 2558250 points
Other Parts Discussed in Thread: MSP430F1611

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/599324/ccs-msp430f1611-using-dma-for-uart-to-transmit-data

器件型号:MSP430F1611
主题中讨论的其他器件: MSP430WARE

工具/软件:Code Composer Studio

我将更改一些代码以在 UART Tx 上使用 DMA。  我在第一次传输时已经能够将数据传输到缓冲区、但没有数据输出、并且处理过程似乎不超过第一个字节。  我已按如下方式设置 UART:

  P3SEL |= BIT4 + BIT5;为 UART0操作设置端口3引脚。

  U0CTL = SWRST + CHAR;  //将 UART 保持在复位状态、UART、8N1
  U0TCTL |=(SSEL0 + SSEL1);   //SMCLK 时钟源
  U0RCTL = 0;   //清除标志
  U0MCTL = 0x00;   //设置波特率
  U0BR0 = 0x20;   //
  对于    230400、U0BR1 = 0x00;// br0 = 20h
   ME1 = UTXE0; //rcv 在发送期间未启用(半双工)
   U0CTL &=~SWRST;   //释放 UART 状态机

当 DMA 运行完成时、如下所示:

  DMA2SZ =大小;
  DMACTL0 |= DMA2TSEL_4;  // DMA2的 Txbuffer 标志触发器
  DMA2SA =(无符号 int)数据;
  DMA2DA =(无符号整型) U0TXBUF;
  // DMA 源增量、字节到字节传输、单字节传输(重复)、电平敏感、启用 int

DMA2CTL = DMASRCINCR_3 + DMASBDB + DMADD_4 + DMALEVEL+ DMAIE + DMAEN;//运行 DMA

在调试中、一切看起来都是按预期设置的、单步执行最后一行显示 UTXIFG0标志变为零、这意味着一个字节已经被放入缓冲区中。

允许代码继续、Tx 端口上没有显示任何内容。  我还可以看到、控制485驱动器方向的引脚也被设置为传输(代码片段中未显示)。

我还在 DMA 的中断例程中设置了一个制动点、并且中断点从未命中。  我还尝试使用单独的步骤来启用 DMA、但没有看到任何更改。

我想我缺少一些非常简单的东西、但我无法弄清楚什么。

 

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

    是否在 IE1寄存器中启用了 UTXIE0? 如果是这样、UTXIFG0将不会触发 DMA 传输。
    此外、您似乎在增加源代码、但仅提供一个 int。 您可能在此处访问错误的内存部分。
    此外、您正在尝试将一个完整字传输到仅占用字节的 UART 缓冲区。 在 DMA2CTL 内启用字节传输。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在用户指南中、我确实看到 IE 位被置位会禁用 DMA 对 UTXIFG0标志的响应、所以它没有被置位。 此外、DMASBDB 的位也被置位、所以 DMA 只能递增1 (字节到字节的传输)。 是吗? unsigned int 来自 MSP430ware 中的 DMA 示例代码、应为16位、涵盖此 MCU (MSP430F1611)的整个存储器空间。 我读过、用于电平触发的位只能与外部触发器一起工作。 我将看到它是否会发生任何变化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    找到答案。 Jace 感谢您的提示。 这让我专注于 U0TXBUF 的铸造。 需要的值
    DMA2DA =(无符号整型)&U0TXBUF;
    指针魔法再次冲击。
    我还做了另一个最有效的更改、即:
    DMA2CTL = DMASRCINCR_3 + DMASBDB + DMALEVEL + DMAIE + DMAEN;
    这将使传输成为单个(不重复)。 区别在于 DMASZ 变为0时 DMAEN 复位。 这意味着我不必担心最后一个数据包后的复位、也意味着当 DMASZ 设置为下一个数据包大小时、DMA 在 DMAEN 再次置位之前不会自动开始。