请教串口DMA发送问题
用32G12K64的串口3通过DMA发送数据,数据长度最长不超过20,看到例程好像是每发一个数据,都会进一次DMA发送中断,
不是把全部的数据数据发送完才进中断吗?
dma串口是把数据发完了进中断,是不是你开了串口中断了? jwd 发表于 2024-9-5 06:50
dma串口是把数据发完了进中断,是不是你开了串口中断了?
你的分析是对的,估计开了。 本帖最后由 深山老妖 于 2024-9-5 12:24 编辑
jwd 发表于 2024-9-5 06:50
dma串口是把数据发完了进中断,是不是你开了串口中断了?
在论坛里看到的例程,看不明白。
wnagming 发表于 2024-9-5 12:43
不应该呀,DMA设置好就不用管了,这里怎么还在处理字节?
所以我也感觉到奇怪。 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 16:29
请问数据是如何复制进DMA缓冲区的,一直没有看明白,下面是自己的应用
unsigned char xdata TX3_485_DAT ...
理解反了,其实是将任意一块xdata区域指定一段长度,然后让dma发送。不用专门的做一个缓冲区复制。
数据的来源一般是产生数据或者是其他区域接收数据后处理完成 王昱顺 发表于 2024-9-5 18:41
理解反了,其实是将任意一块xdata区域指定一段长度,然后让dma发送。不用专门的做一个缓冲区复制。
数据 ...
对于我的这个情况,应该怎么写? 深山老妖 发表于 2024-9-5 18:44
对于我的这个情况,应该怎么写?
在缓冲区内随便填东西,最后使用
DMA_UR3T_CR = 0XC0; //启动DMA 开始发送数据
语句启动发送就好了 王昱顺 发表于 2024-9-5 18:49
在缓冲区内随便填东西,最后使用
DMA_UR3T_CR = 0XC0; //启动DMA 开始发送数据
语句启动发送就好了 ...
想知道的是,如何把TX3_485_DATA内部的内容放进缓冲区。
页:
[1]
2