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.

[参考译文] MSP430F5529:软件 MSP430F5529-LP 使用 DMA0 向 USC0 发送字节块

Guru**** 2609945 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1582403/msp430f5529-software-msp430f5529-lp-send-block-of-bytes-out-usc0-using-dma0

器件型号:MSP430F5529


我尝试使用 DMA0 从 UART 0 发送一些字节、无法使其正常工作。 我已经尝试使用驱动程序库和寄存器 Numonics,没有运气。  我已经看了 DMA 示例、有一个在我的电路板上工作、但它使用计时器触发发送、这不是我想要的。  我希望软件触发发送的开始。   

 


#include
#include “driverlib.h"</s>“
#include

静态字符串 1[]={“Hello World\r\n“};

/*使用 UCA0TXIFG 将 DMA 通道 0 配置为重复单次传输*/
静态 void dmaSetupForUart (void)
  DMA_initParam Param2 ={0};

  param2.channelSelect = DMA_CHANNEL_0;
  param2.transferModeSelect = DMA_TRANSFER_REPEATED_SINGLE;
  param2.transferSize =(sizeof String1 - 1);/*排除终止 NUL */
  PARAM2.triggerSourceSelect = DMA_TRIGGERSOURCE_17;/* UCA0TXIFG */
  PARAM2.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE;
  PARAM2.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE;

  DMA_init (&PARAM2);

  DMA_setSrcAddress (DMA_CHANNEL_0、
    (uint32_t)(uintptr_t) 字符串 1、
    DMA_Direction_Increment);

  DMA_setDstAddress (DMA_CHANNEL_0、
    USCI_A_UART_getTransmitBufferAddressForDMA (USCI_A0_BASE)、
    DMA_direction_unchanged);

  /*在我们显式启动 DMA 之前保持禁用状态*/
  DMA_disableTransfers (DMA_CHANNEL_0);
  DMA_clearInterrupt (DMA_CHANNEL_0);
}

/* UART-ARM 源指针并启用传输;Re TXIFG 将触发字节*/
静态 void sendStringViaDma (void)
  /*重新布防时禁用通道*/
  DMA_disableTransfers (DMA_CHANNEL_0);

  /*将源指针重置为字符串的开头*/
  DMA_setSrcAddress (DMA_CHANNEL_0、
    (uint32_t)(uintptr_t) 字符串 1、
    DMA_Direction_Increment);

  /*清除通道 0 的任何待处理 DMA 标志*/
  DMA_clearInterrupt (DMA_CHANNEL_0);

  /*启用传输:UCA0TXIFG 将触发每字节传输*/
  DMA_enableTransfers (DMA_CHANNEL_0);
}

/*可选:DMA 通道 0 ISR 用于检测传输块的完成*/
pragma vector = DMA_vector
__中断无效 DMA_ISR (void)
  switch (_even_in_RANGE (DMAIV、DMAIV_DMA2IFG)){
    case DMAIV_NONE:break;
    用例 DMAIV_DMA0IFG:
      /*块完成。 如果需要单次触发行为、请禁用通道。 */
      /* dma_disableTransfers (dma_channel_0);*/
      休息;
    用于 DMAIV_DMA1IFG:break;
    案例 DMAIV_DMA2IFG:中断;
    默认值:中断;
  }
}

内部 main (void)
  /*停止看门狗*/
  WDT_A_HOLD (WDT_A_BASE);

  /*将 P3.3 配置为 UCA0TXD 外设功能(如果电路板需要,请使用 P3.4)*/
  GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN3);

  /* UART 初始化参数(您的工作设置为 9600)*/
  USCI_A_UART_initParam param1 ={0};
  param1.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
  param1.clockPrescale = 6;
  param1.firstModReg = 13;
  param1.secondModReg = 0;
  param1.parity = USCI_A_UART_NO_PARITY;
  param1.msborLsbFirst = USCI_A_UART_LSB_FIRST;
  param1.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;
  param1.uartMode = USCI_A_UART_MODE;
  param1.oversulf = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERGE;

  if (STATUS_FAIL == USCI_A_UART_init (USCI_A0_BASE、&param1)){
    当 (1){}/* init 失败*/
  }

  USCI_A_UART_ENABLE (USCI_A0_BASE);

  /*准备 DMA */
  dmaSetupForUart();

  /*为完成通知启用 DMA 中断(可选)*/
  DMA_enableInterrupt (DMA_CHANNEL_0);
  __ enable_interrupt ();

  /*示例:通过 DMA 每秒发送一次字符串*/
  对于 (;;){
    sendStringViaDma();

    /*等待以使字符串不会淹没终端;根据您的时钟进行调整*/
    __ delay_cycles (1000000);
  }

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

    问题是没有触发 DMA。 为此、TXIFG 上需要一个上升沿。 因为这是从一开始就设置好的、所以必须发生一些事情来切换它。

    最简单的方法是直接将字符串的第一个字节写入 TXBUF。 这是我做的。

    我想您可以尝试清除 和设置 TXIFG、因为该位是可写的、但我从未尝试过。

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

    是的、我能够使用启动第一个字节的方法让它正常工作、然后后续的字节由 TXIFG 触发、但是我想知道是否有其他方法可以启动。  我可以尝试清除和设置 TXIFG、看看会发生什么。