深山老妖 发表于 2024-9-5 02:45:47

请教串口DMA发送问题

用32G12K64的串口3通过DMA发送数据,数据长度最长不超过20,
看到例程好像是每发一个数据,都会进一次DMA发送中断,
不是把全部的数据数据发送完才进中断吗?

jwd 发表于 2024-9-5 06:50:41

dma串口是把数据发完了进中断,是不是你开了串口中断了?

liuzonggong 发表于 2024-9-5 07:50:28

jwd 发表于 2024-9-5 06:50
dma串口是把数据发完了进中断,是不是你开了串口中断了?

你的分析是对的,估计开了。

深山老妖 发表于 2024-9-5 12:22:52

本帖最后由 深山老妖 于 2024-9-5 12:24 编辑

jwd 发表于 2024-9-5 06:50
dma串口是把数据发完了进中断,是不是你开了串口中断了?
在论坛里看到的例程,看不明白。





深山老妖 发表于 2024-9-5 12:59:34

wnagming 发表于 2024-9-5 12:43
不应该呀,DMA设置好就不用管了,这里怎么还在处理字节?

所以我也感觉到奇怪。

深山老妖 发表于 2024-9-5 16:29:49

jwd 发表于 2024-9-5 06:50
dma串口是把数据发完了进中断,是不是你开了串口中断了?

请问数据是如何复制进DMA缓冲区的,一直没有看明白,下面是自己的应用

unsigned char xdata TX3_485_DATA;
unsigned char xdata RX3_485_DATA;

/*--------------------------------------------
初始化串口3DMA,只使能DMA发送,不使能DMA接收
--------------------------------------------*/
void DMA_UART3_Init(void)            
{
    DMA_UR3T_STA = 0x00; //清除标志
                DMA_UR3T_CFG = 0x8A; //允许DMA中断, 中断Priority_2优先级,传输Priority_2优先级
                DMA_UR3R_CFG = 0x00; //关闭接收DMA       
}
/*--------------------------------------------
串口3 DMA发送
Led:数据长度 最大不大于20
TX3_485_EN:485发送使能
--------------------------------------------*/
void DMA_TX3_DATA(unsigned char Len)//发送数据
{       
        DMA_UR3T_AMT = 0x15;                //设置传输总字节数(低8位):n+1 共20个数据
        DMA_UR3T_AMTH = 0x00;                //设置传输总字节数(高8位):n+1       
       
//将TX3_485_DATA内的数据复制至发送缓冲区如何复制?       
       
        TX3_485_EN    = 1;//开启485发送使能
        DMA_UR3T_CR   = 0XC0; //启动DMA 开始发送数据
}


/*----------------------------
UART3 DMA TX 中断服务程序
-----------------------------*/

void DMA_UR3T() interrupt 54 //串口3 DMA TX中断
{
        if (DMA_UR3T_STA & 0x01)        //发送完成
        {
                DMA_UR3T_STA &= ~0x01;
                DmaTxFlag = 1;
                TX3_485_EN    = 1;//关闭485发送使能
        }
        if (DMA_UR3T_STA & 0x04)        //数据覆盖
        {
                DMA_UR3T_STA &= ~0x04;
        }
}

王昱顺 发表于 2024-9-5 18:41:34

深山老妖 发表于 2024-9-5 16:29
请问数据是如何复制进DMA缓冲区的,一直没有看明白,下面是自己的应用

unsigned char xdata TX3_485_DAT ...

理解反了,其实是将任意一块xdata区域指定一段长度,然后让dma发送。不用专门的做一个缓冲区复制。
数据的来源一般是产生数据或者是其他区域接收数据后处理完成

深山老妖 发表于 2024-9-5 18:44:50

王昱顺 发表于 2024-9-5 18:41
理解反了,其实是将任意一块xdata区域指定一段长度,然后让dma发送。不用专门的做一个缓冲区复制。
数据 ...

对于我的这个情况,应该怎么写?

王昱顺 发表于 2024-9-5 18:49:42

深山老妖 发表于 2024-9-5 18:44
对于我的这个情况,应该怎么写?

在缓冲区内随便填东西,最后使用
DMA_UR3T_CR   = 0XC0; //启动DMA 开始发送数据
语句启动发送就好了

深山老妖 发表于 2024-9-5 18:52:14

王昱顺 发表于 2024-9-5 18:49
在缓冲区内随便填东西,最后使用
DMA_UR3T_CR   = 0XC0; //启动DMA 开始发送数据
语句启动发送就好了 ...

想知道的是,如何把TX3_485_DATA内部的内容放进缓冲区。
页: [1] 2
查看完整版本: 请教串口DMA发送问题