搜索
bottom↓
12
返回列表 发新帖
楼主: chaled

STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!

  [复制链接]

出0入17汤圆

发表于 2015-2-13 10:56:21 | 显示全部楼层
weshare 发表于 2015-2-12 23:50
哪里有啊?可以帮忙找下?找不到。

利用空闲中断,不需要额外定时器及定时器触发引脚。

我把驱动放在这个帖子里了。
http://www.amobbs.com/thread-5611771-1-1.html

出0入0汤圆

发表于 2015-2-13 10:59:12 | 显示全部楼层
wicy001 发表于 2015-2-13 10:56
利用空闲中断,不需要额外定时器及定时器触发引脚。

我把驱动放在这个帖子里了。

我用的是单线串口,不知道什么时候会触发空闲中断,空闲中断这个手册没有详细说明啊

出0入17汤圆

发表于 2015-2-13 12:21:12 | 显示全部楼层
weshare 发表于 2015-2-13 10:59
我用的是单线串口,不知道什么时候会触发空闲中断,空闲中断这个手册没有详细说明啊 ...

我的理解是:1.接收到数据(RXNE置位) 2.一段时间,没有新数据,即空闲 , 满足这两个条件,空闲标志就置位了。

出0入0汤圆

发表于 2015-2-13 15:13:10 | 显示全部楼层
本帖最后由 weshare 于 2015-2-14 08:42 编辑

中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列获取数据即可!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-4 14:55:23 | 显示全部楼层
楼主的方法很好,受教了,平时只发送用DMA

出0入0汤圆

发表于 2015-3-4 17:23:09 | 显示全部楼层
谢楼主分享经验

出0入0汤圆

发表于 2015-3-12 00:26:06 | 显示全部楼层
遇到个怪怪问题,我串口用dma方式,我波特率为115200,接收数据量为10k,dma数据直接到外挂ram上,但是只能接收的20多k数据,其他数据都没有接收到,不知道有没有遇到过的?

出0入0汤圆

发表于 2015-3-16 13:42:19 | 显示全部楼层
.。。。。。。。。。。。。。

出0入0汤圆

发表于 2015-6-15 17:08:06 | 显示全部楼层
kaimpf 发表于 2013-4-22 20:03
关于fifo,所看到的代码来源都是Linux kfifo.c,整合比较好的是ST的Apple IAP代码,封装很好,与具体应用无 ...

哪里有,ST的Apple IAP代码   求资料,求连接

出0入8汤圆

发表于 2015-6-15 17:26:25 | 显示全部楼层
DMA还没玩过,感觉好笨啊~

出0入0汤圆

发表于 2015-6-21 09:44:58 | 显示全部楼层
mark,正在看串口部分

出0入0汤圆

发表于 2015-6-27 17:12:44 | 显示全部楼层
wicy001 发表于 2013-4-22 19:41
楼主的思路很好,学习了。

PS:stm32串口有一个空闲中断,省一个定时器,可以实现DMA接受不定长数据,坛子 ...

手册上不是这么描述的,手册上看波形是接收到一个0xFF才认为是空闲帧,接收到一个 idle frame charactor

出0入17汤圆

发表于 2015-6-28 16:26:28 | 显示全部楼层
albert.hu 发表于 2015-6-27 17:12
手册上不是这么描述的,手册上看波形是接收到一个0xFF才认为是空闲帧,接收到一个 idle frame charactor  ...

我在103L的回复:

【我的理解是:1.接收到数据(RXNE置位) 2.一段时间,没有新数据,即空闲 , 满足这两个条件,空闲标志就置位了。】

而且,我已经用了很长时间了,没有发现问题。

出0入0汤圆

发表于 2015-6-28 19:34:38 | 显示全部楼层
chaled 发表于 2013-4-22 20:15
真的么?看来我没有把STM32的串口研究透彻呀。只知道ATMEL的有一个串口超时中断很好用。
谢谢提示,我仔 ...

额。。。IDLE信号->串口空闲

出0入0汤圆

发表于 2015-6-29 09:49:08 | 显示全部楼层
wicy001 发表于 2015-6-28 16:26
我在103L的回复:

【我的理解是:1.接收到数据(RXNE置位) 2.一段时间,没有新数据,即空闲 , 满足这 ...

实验验证了一下,的确是可以这样工作的,但是手册上IDLE的描述就不是这么描述,看来手册是有问题的

出0入17汤圆

发表于 2015-6-29 22:26:21 | 显示全部楼层
albert.hu 发表于 2015-6-29 09:49
实验验证了一下,的确是可以这样工作的,但是手册上IDLE的描述就不是这么描述,看来手册是有问题的 ...

虽未看到波形,直觉与手册上说的并不冲突。

串口空闲时,总线为高电平,正常的数据帧是以起始位(低电平)开头的,空闲时的一帧就是包含起始位十数据位十停止位全部是高电平。
所以空闲帧的波形必然是0xff,如果说收到数据0Xff,就不对了。

出0入0汤圆

发表于 2015-6-30 09:24:43 | 显示全部楼层
wicy001 发表于 2015-6-29 22:26
虽未看到波形,直觉与手册上说的并不冲突。

串口空闲时,总线为高电平,正常的数据帧是以起始位(低电平)开 ...

确认我理解错了,手册用了idle character  break character 这样了词,以为是判字符
开始看的是这副图,认为IDLE FRAME也是数据,文字里描述都是高位


这幅图就对了,IDLE是无需起始位,其实就是没收到任何数据,但是break是有起始位的,会收到0x00的数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

发表于 2015-6-30 12:30:15 | 显示全部楼层
albert.hu 发表于 2015-6-30 09:24
确认我理解错了,手册用了idle character  break character 这样了词,以为是判字符
开始看的是这副图, ...

idle character = idle frame,这确实是个坑。

出0入0汤圆

发表于 2015-10-29 11:15:47 | 显示全部楼层
weshare 发表于 2015-2-13 15:13
中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列 ...

这个真的是一个很好的思路,很棒

出0入0汤圆

发表于 2016-4-8 22:01:15 | 显示全部楼层
这种方式流控怎么处理呢?不好弄吧!

出0入0汤圆

发表于 2016-4-24 01:46:05 | 显示全部楼层
有时间学习一下!

出0入0汤圆

发表于 2016-4-24 10:22:46 来自手机 | 显示全部楼层
很有意思的觀點,受教了。

出0入0汤圆

发表于 2016-4-24 12:20:05 | 显示全部楼层
DMA肯定是比原来的方法快很多,就是编程复杂一点,

出0入0汤圆

发表于 2016-4-24 20:09:48 | 显示全部楼层
好东西,感谢楼主分享

出0入0汤圆

发表于 2016-5-10 16:02:41 | 显示全部楼层
weshare 发表于 2015-2-13 15:13
中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列 ...

楼主有串口DMA接收到FIFO中的工程么,有的话发我一份

出0入0汤圆

发表于 2016-8-11 22:17:55 | 显示全部楼层
当然,考虑到可能把缓冲区撑爆的情况,所以开启通道传输完成标志位,在传输完成中断中查询一下队列中有多少数据没有读取出来,如果太多数据没有读取,那么在中断里面处理读取FIFO数据并做相应处理!

你这种方式无法检测缓冲区撑爆的情况,因为DMA控制器并不知道当前的读出指针的位置,况且手册也说到,循环模式时,传输完成中断是无效的(STM32F4芯片)。

不过受到你的启发了,这样确实能更高效的接收串口数据

出0入0汤圆

发表于 2016-8-11 23:33:09 | 显示全部楼层
学习了 很有用  

出0入0汤圆

发表于 2016-8-12 08:41:43 | 显示全部楼层
记录一下。 这个要用到。

出0入0汤圆

发表于 2016-8-12 08:48:22 | 显示全部楼层
666666666666666

出0入0汤圆

发表于 2016-8-12 09:24:02 | 显示全部楼层
很好,学习。

出0入0汤圆

发表于 2016-8-12 11:38:33 | 显示全部楼层
解决了我一个之前一直梗着的一个问题!
我一开始使用每个字节中断一次,然后写入到FIFO中去,虽然没有碰到什么问题但消耗资源较多。

出0入0汤圆

发表于 2016-10-18 10:46:47 | 显示全部楼层
谢谢分享,学习了。

出0入0汤圆

发表于 2016-11-8 14:29:16 | 显示全部楼层
好酒不怕巷子深,好文章自能流传

出0入0汤圆

发表于 2016-11-11 14:52:23 | 显示全部楼层
这个要学习一下。

出0入0汤圆

发表于 2016-11-11 16:11:45 | 显示全部楼层
马克!找个时间测试下

出0入0汤圆

发表于 2016-11-13 08:34:26 来自手机 | 显示全部楼层
FIFO很重

出0入0汤圆

发表于 2016-11-13 08:37:25 来自手机 | 显示全部楼层
holdkcsxym 发表于 2016-11-13 08:34
FIFO很重

要,在离散pid计算中可找出本次和前几次关系时也要用到这个数据结构。

出0入0汤圆

发表于 2017-2-28 14:14:48 | 显示全部楼层
weshare 发表于 2015-2-13 15:13
中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列 ...

能大致说说你这个吗,谢了

出0入0汤圆

发表于 2017-3-1 11:19:39 | 显示全部楼层
weshare 发表于 2015-2-13 15:13
中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列 ...

可以说哈你这个不,我感觉你都没有使能FIFO的,咋用到fifo的

出0入0汤圆

发表于 2017-3-1 12:39:44 | 显示全部楼层
收藏了,用到的时候研究

出0入0汤圆

发表于 2017-3-1 14:36:05 | 显示全部楼层
weshare 发表于 2015-2-13 15:13
中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列 ...

可以说哈你读数据的那几句话吗?


出0入0汤圆

发表于 2017-5-18 09:51:18 | 显示全部楼层
先收着,我用DMA+串口空闲中断感觉还不错。之前用查询方式,整体运行时间太长,用了DMA+串口空闲中断运行时间减小一半以上。回头再用用你这个方法试试看

出0入4汤圆

发表于 2018-10-31 00:06:05 | 显示全部楼层
kgdso210 发表于 2017-5-18 09:51
先收着,我用DMA+串口空闲中断感觉还不错。之前用查询方式,整体运行时间太长,用了DMA+串口空闲中断运行时 ...

两种方法测试对比有何结果》孰优孰劣?

出0入0汤圆

发表于 2018-11-1 17:30:19 | 显示全部楼层
先收藏,再学习

出0入0汤圆

发表于 2018-11-2 00:28:24 | 显示全部楼层
还是DMA接收省资源

出190入0汤圆

发表于 2018-11-2 07:30:39 来自手机 | 显示全部楼层
接收用空闲中断加dma,发送用dma,前提是要有环形缓冲区机制,效率非常高

出0入0汤圆

发表于 2018-11-2 16:46:37 | 显示全部楼层
楼主思路很好,学习了

出0入0汤圆

发表于 2018-12-29 11:49:29 | 显示全部楼层
weshare 发表于 2015-2-13 15:13
中午自己写了下,共享出来给大家。接收非常正常!!!不用接收中断,好方便,只要配置下DMA方式,还有队列 ...

哥们请教下一直困扰的问题,利用宏创建的这种结构,source insight要怎么才能识别?

//队列定义
#define CREATE_QUEUE(QueueName,BufSize,AddrOfCNDTR)     \
        char QueueName##Buf[BufSize];                                    \
        FIFO_TYPE  QueueName = {BufSize,0,QueueName##Buf,AddrOfCNDTR}

//队列声明
#define QUEUE_DELARTION(QueueName)  extern FIFO_TYPE QueueName

出105入79汤圆

发表于 2018-12-29 14:50:50 | 显示全部楼层
其实有串口空闲中断,空闲了 去搬运DMA Buffer 里面的数据就是了。

出0入0汤圆

发表于 2018-12-29 16:59:22 | 显示全部楼层
思路很新颖, 学习了

出0入0汤圆

发表于 2020-4-28 15:55:59 | 显示全部楼层
啊哈哈哈,来学习了,mark

出0入0汤圆

发表于 2020-4-28 16:49:24 | 显示全部楼层

谢楼主分享经验
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 14:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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