OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5436|回复: 4

串口DMA接收和发送并发的时候,请问如何避免打断发送?

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-4-22
在线时间
3 小时
发表于 2021-3-30 16:27:00 | 显示全部楼层 |阅读模式
1金钱
请问各位;串口DMA发送和接收都打开的情况下,DMA空闲中断  接收数据的时候回调用 HAL_UART_DMAStop,此时DMA关闭了,程序此时其他位置有DMA发送,导致发送失败,请问如何避免,网上找到网友提供 HAL_UART_DMA_StopRX ,但是貌似没有此函数;谢谢解答!

void Usart3Receive_IDLE(UART_HandleTypeDef *huart)
{
    uint32_t temp;
    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除标志位
        HAL_UART_DMAStop(&huart3);//这里不用Stop,不然会把发送一起停掉了
            // HAL_UART_DMA_StopRX(huart);//改为用StopRX,这样就不影响DMA发送了
        // temp = huart1.Instance->SR;  //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
        // temp = huart1.Instance->DR; //读取数据寄存器中的数据
        temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);// 获取DMA中未传输的数据个数
        usart3_recv.rx_len =  MAXRECV_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
        usart3_recv.recv_end_flag = 1;  // 接受完成标志位置1
        //==================================================================
        //printf("<%d> %02x\n",usart2_recv.rx_len,usart2_recv.rx_buffer[0]);
        for(int i=0; i<usart3_recv.rx_len; i++)
        {
            //写数据到队列
            RingBuf_write(usart3_recv.rx_buffer[i],pfifo_com3);//复制数据到队列中     DMA直接接收
        }

        //////==================================================
        HAL_UART_Receive_DMA(&huart3,usart3_recv.rx_buffer,MAXRECV_SIZE);//重新打开DMA接收
    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-3-31 01:27:09 | 显示全部楼层
做成互斥的,DMA发送没完成的话,不执行其他程序。。。。其实和不用dma差不多了。
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-4-22
在线时间
3 小时
 楼主| 发表于 2021-3-31 08:14:35 | 显示全部楼层
正点原子 发表于 2021-3-31 01:27
做成互斥的,DMA发送没完成的话,不执行其他程序。。。。其实和不用dma差不多了。

谢谢原子哥答复,数据发送量不大,那就直接用普通中断接收和普通发送,不会有这样的相互影响是吗?谢谢,如果使用只使用DMA接收,发送采用普通的好像也会类似的情况,那我再验证下发送和接收都改成普通的试试
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2021-3-31 15:05:46 | 显示全部楼层
1、DMA发送跟中断并不冲突,中断里面不需要关闭DMA;
2、发送用单次模式,接收用循环模式;
3、波特率不高于115200,建议用中断发送/接收即可。
参考标准库串口DMA收&发,1.5Mbps波特率不翻车:
https://acuity.blog.csdn.net/article/details/108367512
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2020-5-12
在线时间
394 小时
发表于 2022-1-11 17:49:13 | 显示全部楼层
请问你这个问题解决了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 06:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表