81

帖子

0

TA的资源

一粒金砂(初级)

21
 

对,楼主说的这个方法很对,但是我有个疑问

我现在可以这么做,分两次DMA接收,用普通模式。

但是我有个疑问,这样,会不会导致我第一次和第二次接收中丢失数据?

因为第一次DMA进入中断后,假设是10个字节,我的后面数据长度就在这里面,这时候,DMA功能是自动关闭了,但是我需要去判断长度的动作,这需要有耗时,然后再去开一个下次DMA接收的长度,这期间,会不会导致这时候过来的第11个,第12个字节丢失? 如果丢失的话,那即使我后面长度开启了,再次启动了DMA,但是由于第11,第12个字节已经丢失了,所以后面的那段数据过来,DMA会一直认为不满我设的长度值,那么就不会进入DMA中断了,那样的话,是不行的。
此帖出自stm32/stm8论坛
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

22
 

只要第2阶段的传输启动足够快,就不会出现数据丢失

请看下面USART的框图:进入的数据(红线)会首先在"Receive Shift Register"(兰框)装配,完整接收到一个字节后,在传送到"Receive Data Register(RDR)"(黄框)的同时产生RXNE信号,如果有DMA传输则触发一次DMA传输。

第1阶段完成后,进入中断时,"Receive Shift Register"(兰框)和"Receive Data Register(RDR)"(黄框)都是空的,如果这2个寄存器都满了之后还没有从RDR读取数据则会造成数据丢失;即如果你在第2阶段的第3个字节的第1个有效数据位到来时,还未启动第2阶段的数据传输,则会造成数据丢失。

你有传输2个字节数据的时间,准备第2阶段的数据接收,按照你的设置115200波特率,这需要至少174us的时间,对于STM32这是非常长的时间了。你认为你的程序需要这么长的时间吗?
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

23
 

正解

                                  
此帖出自stm32/stm8论坛
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

24
 

哈哈,我洋洋洒洒论证了半天只得到2个字的评语

                                 没关系,等你测试通过后,回来谈谈结果再加上点体会,也算大家没白忙半天。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

25
 

ok,纯顶香主一下,好人啊~~~

                                 我稍后做个整体测试验证一下。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

26
 

mark一下,以后可能用到

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

27
 

这个方法还是有很大隐患的

版主,我今天调试了一下。
昨天我们上面说的是正确的情况下的确是不会有问题的。

但是debug的时候,debug停下来,如果此时PC发数据,肯定会造成timeout,那么这样的话,仿真情况下,是不会再进入DMA中断了。
这种情况还是需要考虑的,因为硬件上RX线不能保证100%不会误传。 

此时USART1的ORE,IDLE都是1,因为已经超时过载了。 

我看了一下这个帖子 http://blog.ednchina.com/STM32/135108/message.aspx  ,版主里面6楼说用定时器加一个I/O口,用定时器来触发超时。 你这里说还要用一个I/O口,I/O口连接哪里?是连接RX和TIM上所在的一个GPIO吗?
另一个方法是用USART的IDLE检测。 所以我USART就使能了IDLE,ORE中断位,但是我发现当我debug的时候,怎么也进不了USART1的中断程序,我原先的想法是,如果超时了,那么就进入USART IDLE ORE中断,我在中断里面清0,并且重新启动DMA 。



此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

28
 

是的,我给出的方法是保证你在正常的情况下有效地操作

如果数据传输错误,你当然要通过适当的方法检测和处理。

我的博客中所说用定时器来触发超时,是把RX与定时器的某个输入相连。


其实你只要允许错误中断(USART_CR3的EIE位),当出现错误时,就会产生中断,在中断中想怎么处理都可以。
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

29
 

奇怪

                                 我通过USART_ITConfig(USART1, USART_IT_ERR, ENABLE); 使能了USART_CR3的EIE位, 但是当我debug过载的情况后,还是没有进入usart1中断,这是为何?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

30
 

调试了看看老

在线上实际过载了的情况下,把程序停下来看看SR寄存器,有没有错误位被置上了。

还有SR寄存器最好不要通过调试界面直接看,最好是先用一个变量把SR的值保存下来,然后在程序停下来以后看变量值。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

31
 

这个我知道的

                                 但是现在是这样,我就usart1设置一个断点,然后我PC发一组错误的数值,应该是进USART1中断了,但是没进去。奇怪啊。 ,我就使能了USART1的出错USART_ITConfig(USART1, USART_IT_ERR, ENABLE);  ,其他USART1的都没有使能
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

32
 

...

没看懂,你到底是进了中断还是没进中断阿?

我的意思是在你觉得应该进中断而没有进的时候,把程序停下来,看SR寄存器,看看错误标志位有没有置起来,再来判断是中断设置的问题还是其他问题。再好做进一步分析么。
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

33
 

我不是说了吗? 我现在没进usart中断

我是想进usart中断来进行出错处理。
但是现在我设了USART_ITConfig(USART1, USART_IT_ERR, ENABLE); 使能了USART_CR3的EIE位, 但是当我debug过载的情况后,还是没有进入usart1中断

我接收是通过dma来接收的,dma的部分是好的,但是就是牵涉到超时出错过载,所以我需要通过usart中断来处理。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

34
 

31楼:“PC发一组错误的数值”,PC如何发奇偶错误的数据?

                                 正确的是8位数据,PC如何发错误的7位或9位数据?
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

35
 

香主,我说的错误的数据是--->

比如: 如果正常情况,我发送24个字节,
现在我一下子发送26个字节,那么就是超出我DMA预定的长度了,这就是我说的错误的长度字节。 并不是说7位或9位数据,我发送的一直是8位数据。
此帖出自stm32/stm8论坛
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

36
 

请按照32楼的建议,看看各个标志位的状态

                                 看看接收缓冲区是否收到应该收到的数据?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

37
 

路过

                                 做个记号 
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

38
 

内容不少啊!!!

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

39
 
                                 正要进行相似的调试,留个标记!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表