对,楼主说的这个方法很对,但是我有个疑问
我现在可以这么做,分两次DMA接收,用普通模式。
但是我有个疑问,这样,会不会导致我第一次和第二次接收中丢失数据?
因为第一次DMA进入中断后,假设是10个字节,我的后面数据长度就在这里面,这时候,DMA功能是自动关闭了,但是我需要去判断长度的动作,这需要有耗时,然后再去开一个下次DMA接收的长度,这期间,会不会导致这时候过来的第11个,第12个字节丢失? 如果丢失的话,那即使我后面长度开启了,再次启动了DMA,但是由于第11,第12个字节已经丢失了,所以后面的那段数据过来,DMA会一直认为不满我设的长度值,那么就不会进入DMA中断了,那样的话,是不行的。
只要第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这是非常长的时间了。你认为你的程序需要这么长的时间吗?
哈哈,我洋洋洒洒论证了半天只得到2个字的评语
没关系,等你测试通过后,回来谈谈结果再加上点体会,也算大家没白忙半天。
ok,纯顶香主一下,好人啊~~~
我稍后做个整体测试验证一下。
这个方法还是有很大隐患的
版主,我今天调试了一下。
昨天我们上面说的是正确的情况下的确是不会有问题的。
但是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 。
是的,我给出的方法是保证你在正常的情况下有效地操作
如果数据传输错误,你当然要通过适当的方法检测和处理。
我的博客中所说用定时器来触发超时,是把RX与定时器的某个输入相连。
其实你只要允许错误中断(USART_CR3的EIE位),当出现错误时,就会产生中断,在中断中想怎么处理都可以。
奇怪
我通过USART_ITConfig(USART1, USART_IT_ERR, ENABLE); 使能了USART_CR3的EIE位, 但是当我debug过载的情况后,还是没有进入usart1中断,这是为何?
调试了看看老
在线上实际过载了的情况下,把程序停下来看看SR寄存器,有没有错误位被置上了。
还有SR寄存器最好不要通过调试界面直接看,最好是先用一个变量把SR的值保存下来,然后在程序停下来以后看变量值。
这个我知道的
但是现在是这样,我就usart1设置一个断点,然后我PC发一组错误的数值,应该是进USART1中断了,但是没进去。奇怪啊。 ,我就使能了USART1的出错USART_ITConfig(USART1, USART_IT_ERR, ENABLE); ,其他USART1的都没有使能
...
没看懂,你到底是进了中断还是没进中断阿?
我的意思是在你觉得应该进中断而没有进的时候,把程序停下来,看SR寄存器,看看错误标志位有没有置起来,再来判断是中断设置的问题还是其他问题。再好做进一步分析么。
我不是说了吗? 我现在没进usart中断
我是想进usart中断来进行出错处理。
但是现在我设了USART_ITConfig(USART1, USART_IT_ERR, ENABLE); 使能了USART_CR3的EIE位, 但是当我debug过载的情况后,还是没有进入usart1中断
我接收是通过dma来接收的,dma的部分是好的,但是就是牵涉到超时出错过载,所以我需要通过usart中断来处理。
31楼:“PC发一组错误的数值”,PC如何发奇偶错误的数据?
正确的是8位数据,PC如何发错误的7位或9位数据?
香主,我说的错误的数据是--->
比如: 如果正常情况,我发送24个字节,
现在我一下子发送26个字节,那么就是超出我DMA预定的长度了,这就是我说的错误的长度字节。 并不是说7位或9位数据,我发送的一直是8位数据。
请按照32楼的建议,看看各个标志位的状态
看看接收缓冲区是否收到应该收到的数据?