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.

[参考译文] MSP430FR5994:配置 DMA 以通过 UART 传输数据

Guru**** 2579155 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/605821/msp430fr5994-configuring-dma-to-transfer-data-over-uart

器件型号:MSP430FR5994

您好!

我尝试使用 DMA 通过 UART 传输数据。 我的目标是使用 DMA 通过 UART 传输128字节。

对于 UART、我使用 UCA3和 DMA 通道3

为了实现这一点,我编写了以下代码:

#include
#include

const uint16_t TX_char = 128;

volatile unsigned char TXData[128]=
"0123456789d!Hello World!Hello World!Hello World!Hello World!HellHello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hell";

volatile unsigned char RXData[128];

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗

//将 GPIO 配置为在中断时切换
P4OUT &=~BIT7;//清除 P4.7输出锁存器以实现定义的加电状态
P4DIR |= BIT7;//将 P4.7设置为输出方向

P3DIR |= BIT4;
P3SEL1 |= BIT4;//输出 SMCLK

P1DIR |= BIT0;
P1SEL1 |= BIT0;//输出 SMCLK

uint16_t c_tx = 0;

//配置 GPIO

P6SEL1 &=~(BIT0 | BIT1);
P6SEL0 |=(BIT0 | BIT1);// USCI_A3 UART 操作

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

//将 USCI_A3配置为 UART 模式
UCA3CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
UCA3CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
UCA3BRW = 8;// 1000000/115200 = 8.68
UCA3MCTLW = 0xD600;// 1000000/115200 - INT (1000000/115200)=0.68
// UCBRSx 值= 0xD6 (请参阅 UG)
UCA3CTLW0 &=~UCSWRST;//从复位中释放

//禁用使用 DMA 执行传输的中断功能
UCA3IE &=(~UCTXIE);//启用 USCI_A3 TX 中断

//配置 DMA

DMA3CTL &=~DMAEN;//只有当 DMAEN = 0时才应设置 DMA 触发
DMACTL0 = DMA3TSEL__UCA3TXIFG;// UC0TXIFG 触发器
//无中断挂起
//DMACTL0 &=~DMAIFG;
__data16_write_addr ((unsigned short)&DMA3SA、(unsigned long)&TXData);
//源单个地址
//__data16_write_addr ((unsigned short)&DMA3DA、(unsigned long)&RXData);
__data16_write_addr ((无符号短整型)&DMA3DA、(无符号长整型)&UCA3TXBUF);
//目标数组地址
DMA3SZ = 128;// 128字节

//启用突发块传输
//源增量
//启用 DMA IE
//字节传输

DMA3CTL = DMADD_1 + DMAEN + DMASRCINCR + DMASRCBYTE
+ DMADSTBYTE + DMADSTINCR;

_bis_SR_register (GIE);//输入 LPM0、中断被启用
__no_operation();

///----------------------------------
// DMA 中断服务例程
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=dma_vector
_interrupt void DMA_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(dma_vector))) dma_isr (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (DMAIV、16))

情况0:中断;
情况2:// DMA0IFG = DMA 通道0
P1OUT ^= BIT0;//切换 P1.0 -在这里放置断点并检查 DMA_dst 变量
中断;
情况4:中断;// DMA1IFG = DMA 通道1
情况6:中断;// DMA2IFG = DMA 通道2
情况8:// DMA3IFG = DMA 通道3
DMA3CTL |= DMAREQ;
P1OUT ^= BIT0;//切换 P1.0 -在这里放置断点并检查 DMA_dst 变量
中断;
情况10:中断;// DMA4IFG = DMA 通道4
情况12:中断;// DMA5IFG = DMA 通道5
情况14:中断;// DMA6IFG = DMA 通道6
情况16:中断;// DMA7IFG = DMA 通道7
默认值:break;

 


在这里、我无法生成任何 DMA 中断。 有人能帮我解决这个问题吗?

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

    您好!  

    您使用这行代码设置了错误的寄存器;

    DMACTL0 = DMA3TSEL__UCA3TXIFG;// UC0TXIFG 触发器 

    DMACTL0只能设置 DMA1和 DMA0触发源。 您希望使用 DMACTL1寄存器:

    DMACTL1 = DMA3TSEL__UCA3TXIFG;// UC0TXIFG 触发器 

    此外、我注意到您已将目标地址设置为递增、我认为这不是您要寻找的行为。 在这种情况下、您很可能希望目标地址保持不变。

    在 main 的末尾、您有以下代码:

    _bis_SR_register (GIE);//输入 LPM0、启用中断
    的_no_operation (); 

    这实际上不会将器件置于 LPM0中、它允许器件退出 main、这是您永远不想执行的操作。 您应该将代码更改为实际进入 LPM0、或者在 main 末尾有一个无限循环、  

    最后、您需要一些东西来触发 DMA 启动、即 UCA3TXIFG 从0变为1。 要启动传输过程、您应将此中断标志从0切换为1。  

    此致、  

    Caleb Overbay

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

    您是否仍然需要有关此问题的帮助?

    此致、
    Caleb Overbay