返回列表 发新帖我要提问本帖赏金: 66.00元(功能说明)

[STM32F1] DMA串口发送问题

[复制链接]
2005|12
 楼主| liuoulyy 发表于 2017-9-30 16:25 | 显示全部楼层 |阅读模式
用DMA串口发送数据,在发送完成下清RS422使能引脚(发送完禁止发送,允许接收).但是DMA发送完,实际是数据并没发送完,RS422引脚就清0了.所以发送不了.不知大侠是怎样处理的?
void DMA1_Channel4_IRQHandler(void)
{       
               
                if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
                {  
                                DMA_ClearFlag(DMA1_FLAG_TC4);
                                GPIO_ResetBits(GPIOB,GPIO_LED2);        //清0         
                                DMA_Cmd(DMA1_Channel4,DISABLE);
                                OSSemPost(Uart1_Tx_E);
     
                }
}
pegion1001 发表于 2017-9-30 17:13 | 显示全部楼层
我是判断huart->gState = HAL_UART_STATE_BUSY_TX;这个
mmuuss586 发表于 2017-9-30 18:33 | 显示全部楼层
先延时一段时间看看;485芯片有延迟;
山东电子小菜鸟 发表于 2017-10-1 14:41 | 显示全部楼层
恩 有延时的
598330983 发表于 2017-10-1 22:51 来自手机 | 显示全部楼层
应该有判断是否发送完的标志位
feelhyq 发表于 2017-10-2 22:26 | 显示全部楼层
本帖最后由 feelhyq 于 2017-10-2 22:40 编辑

void DMA1_Channel4_IRQHandler(void)
{        
        unsigned char u8Flag = 0;                 /* 新增代码 */
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
        {  
               DMA_ClearFlag(DMA1_FLAG_TC4);
               u8Flag  = USART_GetFlagStatus(USART1, USART_FLAG_TC); /* 新增代码,判断串口是不是全部发送完成了 */
               while(1 != u8Flag  ); /* 新增代码,如果没有完成则等在这里 */                                                                                                                                                           USART_ClearFlag(USART1, USART_FLAG_TC); /* 新增代码,清除发送完成标志位 */              
               GPIO_ResetBits(GPIOB,GPIO_LED2);        //清0         
               DMA_Cmd(DMA1_Channel4,DISABLE);
               OSSemPost(Uart1_Tx_E);
   
       }
}

需要判断一下传输是否完成,原因如下:

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)这个判断的作用是DMA搬运完成了,
但是此时最后一个字节数据此时因为DMA搬运完成,搬运到数据寄存器里面去了,数据寄存器
里面的数据并没有完全发送出去,因为串口发送的数据还要通过硬件的移位寄存器(对用户不可见)
一位一位的通过Tx管脚发送出去,这个发送需要一定的时间。

你加了这一句判断if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)后,是无法判断数据有没有完成的,他只是判断DMA数据搬运完成,而不是串口数据发送完成,很可能数据还在移位寄存器里面,正在传输。









打赏榜单

liuoulyy 打赏了 66.00 元 2017-10-20
理由:方案完全正确

dingbo95 发表于 2017-10-3 08:51 | 显示全部楼层
延迟问题,485需要延时一会。
yiy 发表于 2017-10-3 22:13 | 显示全部楼层
通常发送完会有个标志位可以检测。
yiy 发表于 2017-10-3 22:57 | 显示全部楼层
前面的朋友分析的很到位,没有弄对点
捉虫天师 发表于 2017-10-4 13:39 来自手机 | 显示全部楼层
处处有高人啊,假期还在学习的人
zchong 发表于 2017-10-5 10:08 | 显示全部楼层
不要用DMA完成中断,用UART的TC标志
gejigeji521 发表于 2017-10-5 11:52 | 显示全部楼层
各位分析的都挺对的,没想到DMA发送这么多讲究。
yiy 发表于 2017-10-5 18:06 | 显示全部楼层
DMA用起来还是挺复杂的,需要认真仔细。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

472

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部