OpenEdv-开源电子网

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

关于DMA的一个小问题

[复制链接]

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-10-14
在线时间
20 小时
发表于 2018-4-13 16:47:31 | 显示全部楼层 |阅读模式
3金钱
有没有哪位大神尝试过通过串口调试助手将数据发送到串口1的数据寄存器DR并且同时开启串口1的DMA接收功能,在DMA接受完数据并且存储在DMA的数据缓冲区,再开启DMA的发送功能发送到串口1并在串口调试助手打印出来

DMA.rar

5.16 MB, 下载次数: 13

这是我编写的程序 不知道行不行 请指教

最佳答案

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

咋一看 其实我的想法就是第二种比较理想的方法 但是没有接收到数据 应该自己的程序出问题了 我得找找问题去了 谢谢你的回答
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-10-14
在线时间
20 小时
 楼主| 发表于 2018-4-13 16:47:32 | 显示全部楼层
candylife9 发表于 2018-4-14 18:19
就是一个DMA发送+接收的功能啊,很简单。DMA发送很简单,数据写到DMA发送缓冲区,启动发送就可以了。接收要 ...

咋一看  其实我的想法就是第二种比较理想的方法  但是没有接收到数据  应该自己的程序出问题了  我得找找问题去了  谢谢你的回答
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-4-13 19:33:04 | 显示全部楼层
自己下到板上跑一下就知道了啊?我有你描述的前半部分功能的程序。
回复

使用道具 举报

6

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-9-28
在线时间
73 小时
发表于 2018-4-13 20:24:20 | 显示全部楼层
可以在串口DMA接收完成中断中设置一个接收完成标志位,当函数检测到这个标志位后,将DMA接收到的数据复制到DMA发送的缓存里,然后开启DMA发送就可以了
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-10-14
在线时间
20 小时
 楼主| 发表于 2018-4-14 10:57:31 | 显示全部楼层
jinfeihan57 发表于 2018-4-13 19:33
自己下到板上跑一下就知道了啊?我有你描述的前半部分功能的程序。

在板子上跑了一下  没有得到想要的结果  你的程序成功了吗 能不能分享一下你的程序  
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-10-14
在线时间
20 小时
 楼主| 发表于 2018-4-14 10:57:53 | 显示全部楼层
PURSRE 发表于 2018-4-13 20:24
可以在串口DMA接收完成中断中设置一个接收完成标志位,当函数检测到这个标志位后,将DMA接收到的数据复制到 ...

好的   我找个时间试试
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-4-14 16:43:29 | 显示全部楼层
红线绕指柔 发表于 2018-4-14 10:57
在板子上跑了一下  没有得到想要的结果  你的程序成功了吗 能不能分享一下你的程序

把你的邮箱留一下。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-14 18:19:35 | 显示全部楼层
本帖最后由 candylife9 于 2018-4-14 18:27 编辑

就是一个DMA发送+接收的功能啊,很简单。DMA发送很简单,数据写到DMA发送缓冲区,启动发送就可以了。接收要复杂点:1)单字节RXNE中断检测方式,需要做个超时定时器来检测数据包的结束。2)利用串口的IDLE中断检测数据包的结束。  第一个方法呢,会频繁中断,而且要在接收中断里面处理数据接收队列,还有在定时器的更新中断里面做一些接收下一个数据包的逻辑,但是比较灵活。
第二个方法呢,一个数据包中断一次,然后直接保存DMA接收缓冲区里面的数据就可以了。
咋一看,第二个方法绝对完美。。。但是现实没有百分百完美,有时候你的外设(这里指你的串口调试助手)发送一个数据包的时候,会因为串口速率或程序执行的问题而导致拆分成两个间隔几个毫秒的数据包。。。所以用哪个方法还是要取决于你用的外设。当然串口调试助手我还没有遇到过这种尴尬的情况,但是我在别的项目中遇到过。。。。所以,你是可以用第二种方法做DMA接收的。
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-10-14
在线时间
20 小时
 楼主| 发表于 2018-4-14 21:20:41 | 显示全部楼层
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-16 08:59:50 | 显示全部楼层
红线绕指柔 发表于 2018-4-14 21:25
咋一看  其实我的想法就是第二种比较理想的方法  但是没有接收到数据  应该自己的程序出问题了  我得找找 ...

1、看看串口时钟有没有打开
2、看看复用时钟有没有打开
3、看看串口有没有使能
4、看看DMA有没有开启
5、看看DMA和串口的配置函数是否调用
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 15:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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