OpenEdv-开源电子网

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

串口DMA接收,DMA开启后,会收到上一次残留的数据

[复制链接]

13

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-8-15
在线时间
52 小时
发表于 2018-8-10 22:14:05 | 显示全部楼层 |阅读模式
10金钱
用DMA来做串口数据的接收,发现如果有一次接收的数据溢出了,也就是接收字节的长度超过了数组的长度(我理想的是溢出的数据直接忽略),那么下次DMA一开,数组的第一位就会多一个数,CNDTR会少一位。我调试了一下,应该是DMA一开启,DMA就立即把RDR残留的数据,也就上次没收完的最后一个字节传到了第一位数组里。
我不希望下次DMA一开就接收上次残留的数据,我把RXNE清0也没用,有没有高人知道该如何处理这个问题呢?

最佳答案

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

经过大量尝试之后,找到了个方法,不过稍微有点麻烦。以下步骤和顺序缺一不可。 1.首先在串口初始化的时候,CR3的OVRDIS置1,禁用溢出检查,如果不禁用的话,就需要每次溢出后去清ORE位。 2.每次开启DMA前,先清除RXNE位,也就是读RDR寄存器,或者对RQR的RXFRQ写1。 3.如果第一步没有禁用溢出检查,则需要清除ORE位,也就是对ICR的ORECF写1。 4.重置串口CR3的DMAR位,也就是对DMAR先清0再写1。 5.最后再使能DMA,就不会接收 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-8-15
在线时间
52 小时
 楼主| 发表于 2018-8-10 22:14:06 | 显示全部楼层
经过大量尝试之后,找到了个方法,不过稍微有点麻烦。以下步骤和顺序缺一不可。

1.首先在串口初始化的时候,CR3的OVRDIS置1,禁用溢出检查,如果不禁用的话,就需要每次溢出后去清ORE位。
2.每次开启DMA前,先清除RXNE位,也就是读RDR寄存器,或者对RQR的RXFRQ写1。
3.如果第一步没有禁用溢出检查,则需要清除ORE位,也就是对ICR的ORECF写1。
4.重置串口CR3的DMAR位,也就是对DMAR先清0再写1。
5.最后再使能DMA,就不会接收到上次残留的数据了。

我的单片机是stm32f3系列,寄存器可能和f1有点区别,方法是通用的。
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-11 11:27:10 | 显示全部楼层
帮顶
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-11 11:27:42 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-7-18
在线时间
31 小时
发表于 2018-8-14 09:44:13 | 显示全部楼层
帮顶
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
发表于 2018-8-16 14:10:35 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 19:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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