找回密码
 立即注册
查看: 74|回复: 7

DMA串口2发送问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-04-20 18:50:09
已绑定手机

1

主题

11

回帖

57

积分

注册会员

积分
57
发表于 2026-4-15 22:14:51 | 显示全部楼层 |阅读模式
void DMA_usart(void)
{
        DMA_UR2T_CFG = 0x8A;                //bit7 1:Enable Interrupt
        DMA_UR2T_STA = 0x00;
        DMA_UR2T_AMT = 0x63;                //设置传输总字节数(低8位):n+1
        DMA_UR2T_AMTH = 0x00;                //设置传输总字节数(高8位):n+1
        DMA_UR2T_TXAH = (u8)((u16)&DmaT2Buffer >> 8);
        DMA_UR2T_TXAL = (u8)((u16)&DmaT2Buffer);
        DMA_UR2T_CR = 0xc0;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART2_DMA 自动发送

        DMA_UR2R_CFG = 0x8A;                //bit7 1:Enable Interrupt
        DMA_UR2R_STA = 0x00;
        DMA_UR2R_AMT = 0x63;                //设置传输总字节数(低8位):n+1
        DMA_UR2R_AMTH = 0x00;                //设置传输总字节数(高8位):n+1
        DMA_UR2R_RXAH = (u8)((u16)&DmaT2Buffer >> 8);
        DMA_UR2R_RXAL = (u8)((u16)&DmaT2Buffer);
        DMA_UR2R_CR = 0xa1;                        //bit7 1:使能 UART2_DMA, bit5 1:开始 UART2_DMA 自动接收, bit0 1:清除 FIFO
}       
按照官方原码,初始化DMA串口2,上电后串口一直发,在DMA串口中断里加入关闭发送DMA_UR2T_CR = 0x00;也不行,只有在初始化的时候先关闭发送,才能正常,能发送数据,但在上电发送第一次时,前面总会出现一个或几个乱码,在第二次发送是就没有,还有就是开起DMA_UR2T_CR = 0xc0;自动发送后,是发完一次后,自动关闭,要再次写入才能发送,还是一直发送,只有DMA_UR2T_CR = 0x00;关闭后才不发送呢,我的DMA ADC就是读一次要再次触发才工作。两者不一样吗


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:234
  • 最近打卡:2026-04-30 01:26:24
已绑定手机

22

主题

401

回帖

1816

积分

金牌会员

DIY玩家

积分
1816
发表于 2026-4-16 00:31:07 | 显示全部楼层
官方例子程序原码验证DMA功能
希望适用于自己的目标设计
需熟悉DMA底层原理
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-16 09:13:12 | 显示全部楼层
官方的例子串口初始化完后会先打印一串数据:

截图202604160912029818.jpg

DMA初始化时也会触发一次输出:

截图202604160912543081.jpg

不需要的话,这两个地方都修改一下。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-04-20 18:50:09
已绑定手机

1

主题

11

回帖

57

积分

注册会员

积分
57
发表于 2026-4-16 19:37:35 | 显示全部楼层
乘风*** 发表于 2026-4-16 09:13
官方的例子串口初始化完后会先打印一串数据:

串口DMA发送是发完一次自动停止,还是一直发,至到手动停止,接收开启后,是随时接收吗,接收完指定数量后要手动开启,还是覆盖接收

if((DmaTxFlag) && (DmaRxFlag))
                {
                        DmaTxFlag = 0;
                        DMA_UR2T_CR = 0xc0;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART2_DMA 自动发送
                        DmaRxFlag = 0;
                        DMA_UR2R_CR = 0xa1;                        //bit7 1:使能 UART2_DMA, bit5 1:开始 UART2_DMA 自动接收, bit0 1:清除 FIFO
                }根据官方原码,接收和发送完设定数量后,都要重新触发开关再次起动,不知道是不是正确,那么接收就麻烦了,你要随时注意是不是接收完成,好再次起动

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-04-30 08:56:47

849

主题

1万

回帖

2万

积分

管理员

积分
23131
发表于 2026-4-17 08:23:07 | 显示全部楼层
截图202604170822559748.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-17 09:01:02 | 显示全部楼层
amij*** 发表于 2026-4-16 19:37
串口DMA发送是发完一次自动停止,还是一直发,至到手动停止,接收开启后,是随时接收吗,接收完指定数量后 ...

串口DMA开启发送后,发送完指定长度数据后停止发送并产生发送完成中断标志。
串口DMA开启接收后,接收完指定长度数据后停止接收并产生接收完成中断标志。
需要连续发送/接收的话,可在DMA收/发完成中断里面重新启动。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-04-20 18:50:09
已绑定手机

1

主题

11

回帖

57

积分

注册会员

积分
57
发表于 2026-4-17 21:34:59 | 显示全部楼层

我用的是32G8K64没有收到这个东东,可能只有AI32芯片才有
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2026-04-20 18:50:09
已绑定手机

1

主题

11

回帖

57

积分

注册会员

积分
57
发表于 2026-4-17 21:39:53 | 显示全部楼层
乘风*** 发表于 2026-4-17 09:01
串口DMA开启发送后,发送完指定长度数据后停止发送并产生发送完成中断标志。
串口DMA开启接收后,接收完 ...

谢谢你的解答,程序跑通了,确实是你说的情况,但每次上电第一次会多发两个或几个乱码,后面就正常,官方串口发送里面初始化是已经打开DAM,没有乱码发出来,但我的程序如果先开DAM就一直发送数据,这个我有点不懂,我现在IIC,ADC,串口2都 是用的DMA。不知道有没有影响,但没有同时工作
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:30 , Processed in 0.120506 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表