OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12792|回复: 36

串口DMA双缓冲接收外部数据例程分享

[复制链接]

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
发表于 2015-12-4 18:48:20 | 显示全部楼层 |阅读模式
今天调试了下如题的程序,将串口接收到的数据通过DMA方式搬移到内存缓冲区中
并且建立双缓冲区以避免数据覆盖丢失

在串口调试工具的测试下,1ms循环发送500字节的数据不会丢失

目前未测试的内容是将两个缓冲区的内容写入SD卡,可能存在的问题是在存储一个
缓冲区的内容时不能保证另一个缓冲区不会溢出。。。。。

程序可加入的内容是用定时器超时及时将缓冲区的内容存储到sd卡中,以防止外部
部数据传输中止导致DMA传输完成中断不触发

USART_DMA双缓冲接收数据.rar

2.03 MB, 下载次数: 6886

我是一只菜鸟,但我会大鹏展翅
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2020-1-16 18:57:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2020-1-16 17:56:30 | 显示全部楼层
smartlux2016 发表于 2019-11-1 15:15
楼主,急求大作。新手上路,还下载不了。

好像是没法下载了,不知道是不是网站服务器的问题,有时间我上传个基于F4项目的双缓冲配置吧,F4是硬件自带双缓冲配置的,可以参考原子音频例程。这个帖子好像是基于F1做的,基本原理就是,方法1:开辟两个目标小缓存MiniBUF1和MiniBUF2,DMA传输完成中断的时候把目标地址切换到另一个缓存,同时把此时传输满的缓存数据存储到BUF_FIFO(队列缓存,队列数据存储和读取做个地址管理)中,方法2:当然也可以直接把BUF_FIFO划分成N个小缓存,DMA传输完成时目标地址循环切换到每个小缓存,这种方式数据处理实时性会更高一点,因为可以根据当前目标缓存传输完成度算出实际可以读取到BUF_FIFO哪个地址。特殊的也可以采用USART空闲中断+DMA+FIFO的方式(这种方式比较适用于有确定帧空闲的协议数据)。正点原子的USART串口数据接收有定时器超时接收判断和尾字节判断两种,DMA+FIFO的方式场景适用性会更宽泛一些
我是一只菜鸟,但我会大鹏展翅
回复 支持 1 反对 0

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-4 23:03:50 | 显示全部楼层
写入SD卡的速度应该不会比串口慢,保证这点就不会溢出,两边都用DMA的情况下 应该还能腾出时间刷屏
回复 支持 反对

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-12-4 23:16:55 | 显示全部楼层
谢谢分享。。
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2015-12-5 05:33:03 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
已经做好了。测试每1ms发送500*32byte不丢数据。
我把串口的双接收缓冲内容都先放到同一个缓冲区中,这个缓冲区到达一定字节数一次写入SD卡,这样是不是有点浪费内存,是不是
一个缓冲区满之后就直接在传输完成中断里面把数据一次写入SD卡也能达到效果?

还有一点想请教老师一下:如果我想间断性得把SD卡里面的数据通过GPRS发送出去,是不是上操作系统比较好
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-5 13:10:42 | 显示全部楼层
回复【4楼】战舰水手:
---------------------------------
我的本意就是两个缓冲就够了,不需要额外SD卡缓冲。不过需要考虑SD卡的写入次数,双缓冲足够大或是额外加入SD写缓冲,相当于用空间换寿命。

我对操作系统不了解,只是知道操作系统基本上是把任务分时细化完成。如果只是间隔发送GPRS,用个定时器应该就够了。用串口DMA接收,DMA写SD卡,就是为了让CPU有时间来完成其他任务。
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2015-12-5 16:42:12 | 显示全部楼层
回复【5楼】ricefat:
---------------------------------
那DMA的中断会被其它中断打断?
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-5 16:59:36 | 显示全部楼层
回复【6楼】战舰水手:
---------------------------------
看优先级,所谓打断也只是暂停执行程序1转去执行程序2,程序2执行完成又会回到程序1继续执行。能嵌套多少个中断和堆栈有关了,具体我也不清楚,你可以去找找资料。
如果中断执行代码过长可能又会被其他中断打断,中断嵌套太多,最后可能会造成溢出 跑飞。适当注意下这点应该就可以。

最后GPRS速度其实很慢,可能跟串口差不多,这点需要注意下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-5 23:46:59 | 显示全部楼层
不错,谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2015-12-6 00:24:43 | 显示全部楼层
精品,感谢分享
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

6

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2011-2-12
在线时间
36 小时
发表于 2016-3-1 14:35:35 | 显示全部楼层
谢谢楼主分享,保存学习学习
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-4-22
在线时间
7 小时
发表于 2016-5-23 11:08:25 | 显示全部楼层
楼主,我用你的程序怎么通过串口打印不出数据
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2016-6-2 17:43:30 | 显示全部楼层
ksdokso 发表于 2016-5-23 11:08
楼主,我用你的程序怎么通过串口打印不出数据

这个是PC端发数据到MCU,将数据存储到SD卡
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-9-25
在线时间
16 小时
发表于 2016-8-14 12:44:43 | 显示全部楼层
楼主。你共享的这个没有储存的代码呀,能不能共享下,我正在学习,新手不太会
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2016-8-18 17:38:13 | 显示全部楼层
开源小王子 发表于 2016-8-14 12:44
楼主。你共享的这个没有储存的代码呀,能不能共享下,我正在学习,新手不太会

你要存到哪里?
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-9-25
在线时间
16 小时
发表于 2016-8-18 21:29:19 | 显示全部楼层

存到SD卡,用FATFS来做
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2016-8-18 21:56:48 | 显示全部楼层
开源小王子 发表于 2016-8-18 21:29
存到SD卡,用FATFS来做

我的方式:sdio+DMA,然后把相关的初始化和读写函数放到fatfs里面去,f_open  f_write  f_close

你也可以用原子的spi例程,fatfs他也做好了,直接把你要写的数据通过f_open  f_write  f_close写进去就可以
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2016-8-18 22:01:55 | 显示全部楼层
战舰水手 发表于 2016-8-18 21:56
我的方式:sdio+DMA,然后把相关的初始化和读写函数放到fatfs里面去,f_open  f_write  f_close

你也 ...

http://www.openedv.com/thread-82002-1-1.html我分享了我刚学这个时候的资料和例程,sd卡用的原子的spi方式的
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-9-25
在线时间
16 小时
发表于 2016-8-19 15:03:37 | 显示全部楼层
战舰水手 发表于 2016-8-18 22:01
http://www.openedv.com/thread-82002-1-1.html我分享了我刚学这个时候的资料和例程,sd卡用的原子的spi ...

好的,谢谢,先学习着
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-1-14
在线时间
0 小时
发表于 2017-3-5 18:56:55 | 显示全部楼层
楼主,能不能帮我配置一下F407的DMA接收,我怎么弄都不对,你上传的是103,正点资料里面也只有发送示例没有接受的,我按照你的103的配置更改后也不行,求助!
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-20
在线时间
13 小时
发表于 2017-4-19 16:19:32 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2017-4-19 16:26:23 | 显示全部楼层
splendid 发表于 2017-3-5 18:56
楼主,能不能帮我配置一下F407的DMA接收,我怎么弄都不对,你上传的是103,正点资料里面也只有发送示例没有 ...

你可以去看下f407里面录音机实验的DMA配置,录音的过程就是DMA传输的
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

sycist 该用户已被删除
发表于 2017-5-10 22:32:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-8-7
在线时间
3 小时
发表于 2019-8-8 15:52:06 | 显示全部楼层
支持 支持 支持
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-8-4
在线时间
3 小时
发表于 2019-9-9 09:31:10 | 显示全部楼层
学习,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-9
在线时间
2 小时
发表于 2019-10-15 23:39:07 | 显示全部楼层
想学习一下,我没有权限下载,又可以分享一下的嘛,谢谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-10-22
在线时间
1 小时
发表于 2019-10-22 16:57:35 | 显示全部楼层
哇,高手啊
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2016-9-3
在线时间
24 小时
发表于 2019-10-23 20:35:32 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-9-21
在线时间
0 小时
发表于 2019-11-1 15:15:36 | 显示全部楼层
楼主,急求大作。新手上路,还下载不了
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2020-2-17
在线时间
28 小时
发表于 2020-2-17 20:13:31 | 显示全部楼层
不错,谢谢分享。。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-4-24
在线时间
10 小时
发表于 2020-2-29 10:46:40 | 显示全部楼层
楼主niubi
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-6-6
在线时间
2 小时
发表于 2020-2-29 22:38:06 | 显示全部楼层
进来看看。。。
回复 支持 反对

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-8-9
在线时间
48 小时
发表于 2020-3-7 10:05:07 来自手机 | 显示全部楼层
你的例子能给我分享一下吗?
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2016-7-15
在线时间
25 小时
发表于 2020-5-8 17:19:15 | 显示全部楼层
这例程怎么下不了呀
回复 支持 反对

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2020-5-8 17:44:14 | 显示全部楼层
751191958 发表于 2020-5-8 17:19
这例程怎么下不了呀

我也很郁闷,我另外分享了一个新帖子,这个例程我自己都找不到了,重新整理了要
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-6-28
在线时间
7 小时
发表于 2020-7-7 14:49:17 | 显示全部楼层
11111111
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 20:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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