OpenEdv-开源电子网

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

关于STM32串口DMA接收的疑问

[复制链接]

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-11
在线时间
1 小时
发表于 2014-5-22 16:47:05 | 显示全部楼层 |阅读模式
5金钱
仿照原子哥串口DMA发送的实验写了一个接收的程序,程序能运行,但有个地方很不明白。
实验中我想实现可控的单次DMA接收,这是开启函数:
//开启一次DMA传输
void AHRS_USART_DMA_Start(DMA_Channel_TypeDef* DMA_CHx)
{
    DMA_Cmd(DMA_CHx,DISABLE);

    DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);

    DMA_Cmd(DMA_CHx,ENABLE);
}
但是在while大循环里单独执行该函数是开启不了一次DMA接收的,必须重新初始化串口、DMA 、重新使能串口的DMA接收,然后执行上面的函数才可以,这样感觉很别扭,希望高手指点。

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-22 17:31:56 | 显示全部楼层
1、DMA的开启是由外设的事件决定的,你虽然可以手动开,但是并不是你想开就一定有接收的,前提是一定要保证外设的事件(也就是说串口的接收缓冲区非空)。所以不能在while的大循环里单独执行该函数,正确的做法是在DMA的传输完成中断里做这件事。
2、楼猪把DMA开启为单次模式,然后每次传输完先关DMA,然后设置缓冲区长度,然后开DMA,我觉得是没有问题的,应该不需要重新初始化串口、DMA以及重新使能串口的DMA接收。
3、建议楼猪在时序上优化一下吧,其实配置DMA为循环模式也可以实现单次DMA接收啊,就让DMA一直接收,想要数据的时候在DMA传输完成中断里手动抓一下就可以了。
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-11
在线时间
1 小时
 楼主| 发表于 2014-5-22 17:53:44 | 显示全部楼层
回复【2楼】cdshkf:
---------------------------------
谢谢你的回复,活雷锋!
1:目前不希望在DMA中断里放置东西,因为对接收到的数据处理要花一定的时间,刚刚看DMA,不知道他的中断处理需要CPU参与吗?如果不需要,放到中断里处理是极好的。
2:测试的时候是只有都初始化一遍才能再次接收,这点搞不明白。
回复

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-22 18:06:52 | 显示全部楼层
回复【3楼】flyingseed:
---------------------------------
楼猪方便把工程打包贴上来我参考一下么?
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-11
在线时间
1 小时
 楼主| 发表于 2014-5-22 18:15:09 | 显示全部楼层
这是一个串口接收惯性测量单元信息的例子

DMA串口接收.zip

1.88 MB, 下载次数: 3502

回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-11
在线时间
1 小时
 楼主| 发表于 2014-5-22 18:15:48 | 显示全部楼层
回复【4楼】cdshkf:
---------------------------------
已发送
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-11
在线时间
1 小时
 楼主| 发表于 2014-5-22 18:40:51 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,在循环里不停的重新初始化串口、DMA 、重新使能串口的DMA接收这一系列操作会不会影响芯片运行效率?我对这个没有概念呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-22 20:55:50 | 显示全部楼层
这个操作很快了,看你自己能不能接受.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-15 16:46:54 | 显示全部楼层
回复【8楼】flyingseed:
---------------------------------
我用串口的DMA发送,发送完成后,进DMA发送通道的中断,同时接收我也用的DMA接收的,但是我没设置串口接收DMA中断,我设置的是串口空闲中断,这样可以接收不定长的数据,但是我在接收数据处理上遇到麻烦了,虽然“复杂”处理不能放在中断里面处理,但是我实在没什么好办法了,只能把数据处理放在定时器中断里面处理,DMA接收后,在串口空闲中断里面置位接收完成位,然后定时1ms检测这个接收完成位有没有置位,如果置位了,先把这位清0,以便继续DMA接收,然后去处理接收的数据,这个处理我在定时器中断里面处理的,目前实时性还行,据说上操作系统就好很多,可以不用定时器中断处理,但是想想和定时器中断也没啥区别啊
合肥-文盲
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-11-23
在线时间
11 小时
发表于 2016-11-25 09:52:56 | 显示全部楼层
分析得不错 mark一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 08:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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