OpenEdv-开源电子网

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

串口用DMA方式

[复制链接]

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-5-8 16:27:11 | 显示全部楼层 |阅读模式
1金钱
串口用DMA方式读取到一个数组里,持续读取,如果数组满了,之后串口的数据会怎么处理?

最佳答案

查看完整内容[请看2#楼]

你设定DMA的时候需要设定一个多少个数据量,然后需要设定你的数据是多少位,串口么就是8位喽。 然后比如你设定需要搬运10个数据,然后定义一个数组a[10],把DMA的搬运目标地址设定在这个数组上,假设这个数组的地址是0x60000;DMA就会一次把数据放到0x60000~0x60009的地址,每搬运一次地址加1。然后到了第11次,就又回到0x60000,如此循环。 也就是说,会覆盖~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2017-5-8 16:27:12 | 显示全部楼层
你设定DMA的时候需要设定一个多少个数据量,然后需要设定你的数据是多少位,串口么就是8位喽。
然后比如你设定需要搬运10个数据,然后定义一个数组a[10],把DMA的搬运目标地址设定在这个数组上,假设这个数组的地址是0x60000;DMA就会一次把数据放到0x60000~0x60009的地址,每搬运一次地址加1。然后到了第11次,就又回到0x60000,如此循环。
也就是说,会覆盖~
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-5-8 16:36:08 | 显示全部楼层
什么意思?你是说DMA搬数据超过了接受数组的长度吗?
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-8 16:40:47 | 显示全部楼层
小陀螺爱炒蛋 发表于 2017-5-8 16:36
什么意思?你是说DMA搬数据超过了接受数组的长度吗?

DMA开了通道,一直从串口取数据,存到固定数组里面,数组长度10,一直接收数据,后来接收的数据是覆盖,还是泄漏
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-5-8 17:30:12 | 显示全部楼层
Sun_Fly 发表于 2017-5-8 16:40
DMA开了通道,一直从串口取数据,存到固定数组里面,数组长度10,一直接收数据,后来接收的数据是覆盖, ...

应该是泄露,然后上访fault中断,不过也得看ST 是怎么设计的,你写个代码测试下就知道了
回复

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2017-5-8 17:31:40 | 显示全部楼层
会触发DMA接收中断   如果没有开启中断会导致DMA无法接受数据,程序不会死掉
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-8 17:45:49 | 显示全部楼层
loudianxin 发表于 2017-5-8 17:31
会触发DMA接收中断   如果没有开启中断会导致DMA无法接受数据,程序不会死掉

一直处于开启状态,一直用一个buff数组接收,是覆盖还是怎么
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-8 18:20:36 | 显示全部楼层
oyixi001 发表于 2017-5-8 16:27
你设定DMA的时候需要设定一个多少个数据量,然后需要设定你的数据是多少位,串口么就是8位喽。
然后比如你 ...

多谢
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-5-8 20:10:23 | 显示全部楼层
把缓存空间设成2倍大小,做双缓存,过半中断时就 处理数据……
回复

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2017-5-9 08:35:12 | 显示全部楼层
Sun_Fly 发表于 2017-5-8 17:45
一直处于开启状态,一直用一个buff数组接收,是覆盖还是怎么

不会覆盖,数据接收到你设置的DMA数据长度后BUFF就不会再接受到数据,所以就没有覆盖这种情况,BUFF数据不会变。
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-9 10:47:01 | 显示全部楼层
loudianxin 发表于 2017-5-9 08:35
不会覆盖,数据接收到你设置的DMA数据长度后BUFF就不会再接受到数据,所以就没有覆盖这种情况,BUFF数据 ...

既然不会覆盖,那么怎么样做才会覆盖,我想要的是覆盖
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-9 10:48:06 | 显示全部楼层
loudianxin 发表于 2017-5-9 08:35
不会覆盖,数据接收到你设置的DMA数据长度后BUFF就不会再接受到数据,所以就没有覆盖这种情况,BUFF数据 ...

也就是串口DMA取到数据到数组,怎么使用,在什么时候使用,然后还要一直更新数组的内容,
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-9 10:48:34 | 显示全部楼层
d1z1y2 发表于 2017-5-8 20:10
把缓存空间设成2倍大小,做双缓存,过半中断时就 处理数据……

DMA方式  不用中断
回复

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2017-5-9 16:39:01 | 显示全部楼层
Sun_Fly 发表于 2017-5-9 10:48
也就是串口DMA取到数据到数组,怎么使用,在什么时候使用,然后还要一直更新数组的内容,

开DMA接收完成中断,中断里面重新赋值目标数组地址和数据长度。关于接收到规定的长度后DMA什么情况和数组数据会不会覆盖你写个代码测试下就知道了
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-9 18:49:48 | 显示全部楼层
由于DMA采用了连续传输的模式,ADC采集到的数据会不断传到到存储器中(此处即为数组ADC_Value)。ADC采集的数据从ADC_Value[0]一直存储到ADC_Value[99],然后采集到的数据又重新存储到ADC_Value[0],一直到ADC_Value[99]。所以ADC_Value数组里面的数据会不断被刷新。这个过程中是通过DMA控制的,不需要CPU参与。我们只需读取ADC_Value里面的数据即可得到ADC采集到的数据
回复

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-5-16 09:08:54 | 显示全部楼层
楼主 可以把例子发来看看么
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
 楼主| 发表于 2017-5-16 10:17:16 | 显示全部楼层
564646396 发表于 2017-5-16 09:08
楼主 可以把例子发来看看么

我用的hal库,百度例程
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-3-18
在线时间
25 小时
发表于 2017-5-16 10:40:18 | 显示全部楼层
DMA+串口空闲中断就可以解决了。DMA的大小就设定为串口协议最大值。你不会串口协议的数据长度可以无限长的吧?
回复

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-5-16 11:29:16 | 显示全部楼层
Sun_Fly 发表于 2017-5-16 10:17
我用的hal库,百度例程

谢谢哦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 14:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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