求助DMA stm32串口接收缓冲区 乒乓缓冲问题

技术达人, 积分 9512, 距离下一级还需 488 积汾

技术达人, 积分 9512, 距离下一级还需 488 积分

我好奇怪别人的STM32F103能承受1ms接收100字节以上都没问题
这个结论楼主从哪里得来的,人家告诉你的

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

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



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

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

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

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

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

高级工程师, 积分 5716, 距离下一级还需 2284 积分

0

高级工程师, 积分 5716, 距离下一级还需 2284 积分

0

高级工程师, 积分 5716, 距离下一级还需 2284 积分

0

高级工程师, 积分 5716, 距离下一级还需 2284 积分

0

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

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

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

初级工程师, 积分 2483, 距离下一級还需 517 积分

0
去看看 STM32数据手册,手册里面的相关配置写得非常清楚啦

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

初级工程师, 积分 2483, 距离下一级还需 517 积汾

0

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

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

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


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

初级工程师, 积分 2483, 距离下一级还需 517 积分

0

初级工程师, 积分 2483, 距离下一级还需 517 積分

0

实习生, 积分 33, 距离下一级还需 -13 积分

0

实习生, 积分 33, 距离下一级还需 -13 积分

0
11520的波特率1ms只能只能十几个字节,100个字节不知道你这么算出来的
扫描二維码随时随地手机跟帖

STM32串口DMA 传输与乒乓缓冲的深入研究(含源码)

付费资料是一类需要单独购买的资料非VIP用户原价购买,VIP用户可以享受8折的优惠价格

我要回帖

更多关于 linux 串口缓冲区设置 的文章

 

随机推荐