amijzrmo 发表于 2026-4-15 22:14:51

DMA串口2发送问题

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就是读一次要再次触发才工作。两者不一样吗


狂热主宰 发表于 2026-4-16 00:31:07

官方例子程序原码验证DMA功能
希望适用于自己的目标设计
需熟悉DMA底层原理

乘风飞扬 发表于 2026-4-16 09:13:12

官方的例子串口初始化完后会先打印一串数据:



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



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

amijzrmo 发表于 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
                }根据官方原码,接收和发送完设定数量后,都要重新触发开关再次起动,不知道是不是正确,那么接收就麻烦了,你要随时注意是不是接收完成,好再次起动

神农鼎 发表于 2026-4-17 08:23:07


乘风飞扬 发表于 2026-4-17 09:01:02

amijzrmo 发表于 2026-4-16 19:37
串口DMA发送是发完一次自动停止,还是一直发,至到手动停止,接收开启后,是随时接收吗,接收完指定数量后 ...

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

amijzrmo 发表于 2026-4-17 21:34:59

神农鼎 发表于 2026-4-17 08:23


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

amijzrmo 发表于 2026-4-17 21:39:53

乘风飞扬 发表于 2026-4-17 09:01
串口DMA开启发送后,发送完指定长度数据后停止发送并产生发送完成中断标志。
串口DMA开启接收后,接收完 ...

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