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就是读一次要再次触发才工作。两者不一样吗
官方例子程序原码验证DMA功能
希望适用于自己的目标设计
需熟悉DMA底层原理 官方的例子串口初始化完后会先打印一串数据:
DMA初始化时也会触发一次输出:
不需要的话,这两个地方都修改一下。 乘风飞扬 发表于 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
}根据官方原码,接收和发送完设定数量后,都要重新触发开关再次起动,不知道是不是正确,那么接收就麻烦了,你要随时注意是不是接收完成,好再次起动
amijzrmo 发表于 2026-4-16 19:37
串口DMA发送是发完一次自动停止,还是一直发,至到手动停止,接收开启后,是随时接收吗,接收完指定数量后 ...
串口DMA开启发送后,发送完指定长度数据后停止发送并产生发送完成中断标志。
串口DMA开启接收后,接收完指定长度数据后停止接收并产生接收完成中断标志。
需要连续发送/接收的话,可在DMA收/发完成中断里面重新启动。 神农鼎 发表于 2026-4-17 08:23
我用的是32G8K64没有收到这个东东,可能只有AI32芯片才有 乘风飞扬 发表于 2026-4-17 09:01
串口DMA开启发送后,发送完指定长度数据后停止发送并产生发送完成中断标志。
串口DMA开启接收后,接收完 ...
谢谢你的解答,程序跑通了,确实是你说的情况,但每次上电第一次会多发两个或几个乱码,后面就正常,官方串口发送里面初始化是已经打开DAM,没有乱码发出来,但我的程序如果先开DAM就一直发送数据,这个我有点不懂,我现在IIC,ADC,串口2都 是用的DMA。不知道有没有影响,但没有同时工作
页:
[1]