OpenEdv-开源电子网

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

STM32F1 USART利用DMA连续发送 丢数据

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-7-5
在线时间
22 小时
发表于 2019-4-11 11:23:46 | 显示全部楼层 |阅读模式
1金钱


   如题:STM32F103单片机 USART利用DMA连续发送 数据,中途会丢失部分字节。尝试过DMA发送之间用延时,可以解决;但是希望寻找到更为有效的方式:
TIM截图20190411111742.png
根据上图,知道串口的TC标识为1,才说明数据发送完成,所以在软件处理上,增加了标志位的判断:

DMA参数配置

DMA参数配置

TIM截图20190411111959.png

DMA发送函数

DMA发送函数

即使这样,多个DMA发送的时候,还是会出现丢失数据的问题。

请教大师!!!!急求思路方向!

最佳答案

查看完整内容[请看2#楼]

之前一直纠结DMA的TC中断标识、USART的TC中断标识,怎么放,其实关键在于DMA发送的原理:DMA接收到发送指令,配置好各参数,只能开始传递数据到USART_DR寄存器中,USART也开始把数据发送出去,传送结束后DMA1_FLAG_TC4置高,但此时串口发送还未结束,USART_FLAG_TC不会置高,等待一段时间之后,这个动作才能结束,USART串口通讯才能被终止,要不然会影响最后一次传输的数据。 所以,在使用DMA进行串口发送数据的时候,应该先配置D ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-7-5
在线时间
22 小时
 楼主| 发表于 2019-4-11 11:23:47 | 显示全部楼层
之前一直纠结DMA的TC中断标识、USART的TC中断标识,怎么放,其实关键在于DMA发送的原理:DMA接收到发送指令,配置好各参数,只能开始传递数据到USART_DR寄存器中,USART也开始把数据发送出去,传送结束后DMA1_FLAG_TC4置高,但此时串口发送还未结束,USART_FLAG_TC不会置高,等待一段时间之后,这个动作才能结束,USART串口通讯才能被终止,要不然会影响最后一次传输的数据。
所以,在使用DMA进行串口发送数据的时候,应该先配置DMA各参数,然后依次等待DMA1_FLAG_TC4、USART_FLAG_TC置高,也就是此次发送结束,之后才能进行下一包数据的传输。这样就能避免相邻两个数据包的覆盖问题,比加延时更高效,思路也更清晰。关键代码如下,希望对大家有帮助:

void USART1_DMA_Send(char *buffer, uint32_t buffer_size)
{
        DMA_Cmd(DMA1_Channel4, DISABLE);

        DMA1_Channel4->CMAR = (u32)buffer;
        DMA1_Channel4->CNDTR = buffer_size;

        DMA_Cmd(DMA1_Channel4, ENABLE);

        while(DMA1_Channel4_Flag != 0);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
       
        DMA1_Channel4_Flag = 1;
}

回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-7-5
在线时间
22 小时
 楼主| 发表于 2019-4-11 11:32:02 | 显示全部楼层
原子哥,求解答!
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-4-11 12:14:13 | 显示全部楼层
串口空闲中断有没试过
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-7-5
在线时间
22 小时
 楼主| 发表于 2019-4-11 12:38:39 | 显示全部楼层
1208 发表于 2019-4-11 12:14
串口空闲中断有没试过

没有,目前是按照数据使用手册的步骤做的;
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-4-11 14:33:41 | 显示全部楼层
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-7-5
在线时间
22 小时
 楼主| 发表于 2019-4-12 14:42:53 | 显示全部楼层
1208 发表于 2019-4-11 14:33
你参考看下http://www.openedv.com/forum.php?mod=viewthread&tid=276626&extra=

多谢你的帮助,测试了采用空闲中断来做,需要串口接收中断来触发,更适合接收程序处理。
回复

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2017-5-6
在线时间
44 小时
发表于 2019-12-26 12:06:26 | 显示全部楼层
flyinggirlxhx 发表于 2019-4-12 14:42
多谢你的帮助,测试了采用空闲中断来做,需要串口接收中断来触发,更适合接收程序处理。

空闲中断,DMA接收也丢数据啊,怎么处理
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-12-31
在线时间
7 小时
发表于 2019-12-31 17:28:07 | 显示全部楼层
我也在USART1 配置使用DMA收发数据遇到了一些问题,当设置发送数据量过大时,只能输出后面一部分,而且115200bps下,发送2000个字节,用了1.4S
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 18:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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