搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
返回列表 发新帖本帖赏金 66.00元(功能说明)

[STM32F1] DMA串口发送问题

[复制链接]
684|12
 楼主 | 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);
     
                }
}
| 2017-9-30 17:13 | 显示全部楼层
我是判断huart->gState = HAL_UART_STATE_BUSY_TX;这个

使用特权

评论回复
| 2017-9-30 18:33 | 显示全部楼层
先延时一段时间看看;485芯片有延迟;

使用特权

评论回复
| 2017-10-1 14:41 | 显示全部楼层
恩 有延时的

使用特权

评论回复
| 2017-10-1 22:51 | 显示全部楼层
应该有判断是否发送完的标志位

使用特权

评论回复
| 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
理由:方案完全正确

| 2017-10-3 08:51 | 显示全部楼层
延迟问题,485需要延时一会。

使用特权

评论回复
| 2017-10-3 22:13 | 显示全部楼层
通常发送完会有个标志位可以检测。

使用特权

评论回复
| 2017-10-3 22:57 | 显示全部楼层
前面的朋友分析的很到位,没有弄对点

使用特权

评论回复
| 2017-10-4 13:39 | 显示全部楼层
处处有高人啊,假期还在学习的人

使用特权

评论回复
| 2017-10-5 10:08 | 显示全部楼层
不要用DMA完成中断,用UART的TC标志

使用特权

评论回复
| 2017-10-5 11:52 | 显示全部楼层
各位分析的都挺对的,没想到DMA发送这么多讲究。

使用特权

评论回复
| 2017-10-5 18:06 | 显示全部楼层
DMA用起来还是挺复杂的,需要认真仔细。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
返回列表 发新帖 本帖赏金 66.00元(功能说明)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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