OpenEdv-开源电子网

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

使用串口DMA发送数据的时候,先发出的数据被覆盖

[复制链接]

12

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2015-1-28
在线时间
50 小时
发表于 2017-12-1 22:41:39 | 显示全部楼层 |阅读模式
1金钱
  我按照原子的例程调试DMA,发现使用带有DMA的串口,在输出的时候前面打印的数据会被后方的覆盖掉.
按照下方的程序,理论上应该打印:
333
4444
55555

实际打印为:
334455555

也就是说前方数据没有打印完成的时候就被后方数据覆盖掉了.
于是,我在每个printf中间加了一个delay_um(),发现在延时280um时,程序可以正常打印,当延时低于280微秒的时候,数据发生了覆盖,并且随着延时的降低,覆盖的情况越来越严重。
我的问题如下:
1、按照原子的程序,因该增加while(DMA1_Channel7->CNDTR!=0);作为发送完成的标志,否则将继续等待,但是我按照此法添加了while((temp = DMA_GetCurrDataCounter(DMA_Channelx)) != RESET);后,发现程序直接卡死了,这是什么原因造成的?
2、DMA的发送速度这么慢吗?即便是上述发送完成标志可用,每次发送也要等待很长时间,这样的话完全体现不出来DMA的优势了,请问我的程序应该如何设计呢?
  [mw_shl_code=c,true]//USART3的DMA串口打印函数
void u3_printf(char* fmt,...)
{
        va_list ap;
        va_start(ap, fmt);
        vsprintf((char *)DMA_Tran_Buf3, fmt,ap);
        va_end(ap);
        USART_DMA_Send(DMA1_Channel2, strlen((const char *)DMA_Tran_Buf3));
}
//DMA发送函数
void USART_DMA_Send(DMA_Channel_TypeDef * DMA_Channelx, u16 Trans_Len)
{
        int temp = 0;
        DMA_Cmd(DMA_Channelx, DISABLE);
//        while((temp = DMA_GetCurrDataCounter(DMA_Channelx)) != RESET);                //检测CNDTR非空,加了这句以后程序就卡死.

        printf("Trans_Len=%d\n",Trans_Len);
        DMA_SetCurrDataCounter(DMA_Channelx, Trans_Len);
        DMA_Cmd(DMA_Channelx,         ENABLE);
}
        while(1)
        {
                u3_printf("333\n");
                delay_us(DMADELAY);
                u3_printf("4444\n");
                delay_us(DMADELAY);
                u3_printf("55555\n");
                delay_us(DMADELAY);
}[/mw_shl_code]

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

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-2 08:41:32 | 显示全部楼层
这样子证明你要加一个缓冲区了.建立缓冲区可以解决.
回复

使用道具 举报

12

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2015-1-28
在线时间
50 小时
 楼主| 发表于 2017-12-2 09:11:06 | 显示全部楼层
请问一下群里的朋友,为什么while(DMA1_Channel7->CNDTR!=0);为什么卡死
回复

使用道具 举报

12

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2015-1-28
在线时间
50 小时
 楼主| 发表于 2017-12-2 12:56:49 | 显示全部楼层
本帖最后由 opennedver 于 2017-12-2 13:34 编辑

1111111
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-25 19:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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