您好!
我尝试使用 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 中断。 有人能帮我解决这个问题吗?