打印
[STM32F1]

STM32F103C8 串口DMA丢包的问题

[复制链接]
6057|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
apple_3275|  楼主 | 2017-1-11 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先说一下我这边的配置,串口1,115200,配置了空闲中断与DMA接收通道(DMA没有配置中断),DMA接收缓存是5120字节,电脑定时1ms发送48字节,接收完整率是75-80%。
我在网上搜过不少串口DMA丢包问题,暂时还没有用上串口+DMA+FIFO,我好奇怪别人的STM32F103能承受1ms接收100字节以上都没问题,难道是我这个模块问题?还是程序问题?
沙发
yklstudent| | 2017-1-11 14:31 | 只看该作者
我好奇怪别人的STM32F103能承受1ms接收100字节以上都没问题?
这个结论楼主从哪里得来的,人家告诉你的?

使用特权

评论回复
板凳
apple_3275|  楼主 | 2017-1-11 14:36 | 只看该作者
yklstudent 发表于 2017-1-11 14:31
我好奇怪别人的STM32F103能承受1ms接收100字节以上都没问题?
这个结论楼主从哪里得来的,人家告诉你的? ...

呃。。我是逛其他论坛的帖子看到的,你有对它做过这样的压力测试吗?我怀疑1ms发送48个字节就有丢数据的现象是不是我这边的问题

使用特权

评论回复
地板
mmuuss586| | 2017-1-11 15:18 | 只看该作者
电脑的计时是有误差的,实时性不是很高;

你可以找块板子测试下,发数据看看;

使用特权

评论回复
5
feelhyq| | 2017-1-11 15:23 | 只看该作者
本帖最后由 feelhyq 于 2017-1-11 15:27 编辑

        PC端使用的串口助手之类的本质上是挂在windows系统里面的应用程序,它就存在被调度的情况,而且被winodws调度的时机并不是很确定的(windows不是一个实时操作系统),所以导致定时1ms发送48字节也是不确定的。其次串口通信的波特率决定,假如说波特率设置9600,也就是1s传输9600bit,大约1000个字节左右,1ms传输一个字节,DMA只能等待数据来到了寄存器中才能搬运。 建议使用FIFO+DMA功能

使用特权

评论回复
6
apple_3275|  楼主 | 2017-1-21 10:50 | 只看该作者
feelhyq 发表于 2017-1-11 15:23
PC端使用的串口助手之类的本质上是挂在windows系统里面的应用程序,它就存在被调度的情况,而且被w ...

我尝试弄了一块STM32F429IG的开发板配置USART+DMA作为上位机,每隔10ms发送48个字节数据,我发现STM32F103C8用空闲中断+FIFO+DMA,因为要在中断函数里做将48个字节数据导入缓存区里的操作,就已经漏掉上位机一部分字节,比如只接收了后面19个字节。如果什么都不操作,只打印接收到的字节数则都是48.

我想知道这是STM32F103的能力极限,还是我的代码仍有优化空间?

其实我真正要用的上位机是一块串口触摸屏,因为它能兼容5个触点,串口数据就有46个字节,而且厂商只提供TX-RX这两个脚,需要知道STM32F103C8是否能承担这种任务?

使用特权

评论回复
7
feelhyq| | 2017-1-21 13:42 | 只看该作者
apple_3275 发表于 2017-1-21 10:50
我尝试弄了一块STM32F429IG的开发板配置USART+DMA作为上位机,每隔10ms发送48个字节数据,我发现STM32F10 ...

如果波特率是115200就没有问题,因为波特率是115200的话,每1ms可以传输12个字节,即10ms最大传输字节数是120,完全满足你的需求,下位机(STM32F103C8)使用串口时,配置串口的waterlevel 应该设置成1/8,即假如串口的硬件深度为32个字节,满了4个字节就会产生中断,另外还需要开启接收超时的硬件功能,只有这样才能保证数据完全接收到

使用特权

评论回复
8
htmlme| | 2017-1-21 17:20 | 只看该作者
DMA丢包,你读取完成了?

使用特权

评论回复
9
htmlme| | 2017-1-21 17:22 | 只看该作者
STM32的处理速度这么快,可以不用DMA

使用特权

评论回复
10
apple_3275|  楼主 | 2017-1-21 21:06 | 只看该作者
feelhyq 发表于 2017-1-21 13:42
如果波特率是115200就没有问题,因为波特率是115200的话,每1ms可以传输12个字节,即10ms最大传输字节数 ...

我这边的串口波特率一直是用115200,按照你的计算,10ms最大传输120个字节,那我之所以丢数据,也许是因为串口接收中断函数里,将DMA接收到的数据放到FIFO缓存区里耗时导致。

你说的配置串口的waterlevel 是什么意思?我搜不到这个参数

使用特权

评论回复
11
feelhyq| | 2017-1-22 09:04 | 只看该作者
去看看 STM32数据手册,手册里面的相关配置写得非常清楚啦

使用特权

评论回复
12
feelhyq| | 2017-1-22 09:16 | 只看该作者
apple_3275 发表于 2017-1-21 21:06
我这边的串口波特率一直是用115200,按照你的计算,10ms最大传输120个字节,那我之所以丢数据,也许是因 ...

你开启DMA后,每当串口的FIFO里面有数据,硬件会自动帮你拷贝到你的缓存区中。这个时间是非常快的,非常非常快的,所以肯定不是你说的原因。

使用特权

评论回复
13
apple_3275|  楼主 | 2017-1-22 22:11 | 只看该作者
本帖最后由 apple_3275 于 2017-1-22 22:15 编辑
feelhyq 发表于 2017-1-22 09:16
你开启DMA后,每当串口的FIFO里面有数据,硬件会自动帮你拷贝到你的缓存区中。这个时间是非常快的,非常 ...

我稍微理解你意思了,DMA我已经给了个接收用的128个字节的缓存区RxBuffer,一开始你说FIFO,因为我看STM32F103C8 手册,它的DMA是没有FIFO的,包括它的库函数都没有FIFO的配置参数,于是我另外搞了个环形队列14400字节的缓存区,于是就有了昨天的问题。

今天我调试了一天,第一次使能DMA接收通道时,是可以接收到48个字节的完整数据,甚至有61个字节,之后的接收发现DMA只接收了1个字节,可能是串口的空闲中断频率太频繁导致,即便DMA能把串口接收的数据以超快速填充到RxBuffer,DMA只接收了1个字节就被重置;当我做了些DMA重置后的延迟关闭操作,发现它很快就触发了DMA1_IT_TC5中断,说明它是有在接收的------>这里我就没看懂,上位机115200波特率,10ms发送48个字节数据,下位机串口的空闲中断怎么会这么频繁?我一直以为它只要接收到48个字节后才会触发空闲中断,能否说说你的理解。可能你会认为我没有清中断标志位,其实在空闲中断一触发我就已经清掉了该串口的所有中断标志位
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
        USART1->DR;
        USART_ClearITPendingBit(USART1, USART_IT_IDLE | USART_IT_PE | USART_IT_FE | USART_IT_NE | USART_IT_RXNE);
......
}

我终于明白你所说的定时器,双缓存的意思,我得重新设计代码。

使用特权

评论回复
14
feelhyq| | 2017-1-22 23:15 | 只看该作者
apple_3275 发表于 2017-1-22 22:11
我稍微理解你意思了,DMA我已经给了个接收用的128个字节的缓存区RxBuffer,一开始你说FIFO,因为我看STM32 ...

让我们好好列清你现在的问题:
   1.了解STM32串口的使用,包括波特率是什么东西,波特率是怎么算的,如何产生中断,产生中断后需要做哪些事情,做完了这件事情后,是否清中断标志了。
   2。STM32有关DMA的用法,什么事DMA,DMA有什么作用,如何配置DMA,配置好DMA后,DMA能否正常工作。
当你弄清楚上面2个问题后再回帖吧,估计你弄清楚后,问题也就解决了。要耐心,不懂得可以去看看例程是怎么做的。
                                                                                                               加油,你可定能弄出来

使用特权

评论回复
15
lyn3210| | 2017-2-7 15:48 | 只看该作者

使用特权

评论回复
16
1253171658| | 2017-2-7 17:46 | 只看该作者
11520的波特率1ms只能只能十几个字节,100个字节不知道你这么算出来的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝