请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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、¶m1)){
当 (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;
}