查看: 4769|回复: 8

[其他] 有关UART DMA的问题求助

[复制链接]

该用户从未签到

10

主题

68

帖子

0

中级会员

Rank: 3Rank: 3

积分
213
最后登录
2018-10-31
发表于 2017-8-10 17:38:28 | 显示全部楼层 |阅读模式
本帖最后由 贪恋新手 于 2017-8-10 17:45 编辑

最近在学习MK12DN512xxx5这款CPU的DMA模块,我也看了相关的demo程序,但是还有很多疑惑。
目前在我的项目中串口这块采用的是中断处理的,就拿串口接收为例说明如下:
(1)采用中断接收,每次收到一个字节都会触发中断,在中断中将收到的数据写入一个串口接收缓存BUFF中(循环队列)
(2)在主循环中,定时读取串口缓存BUFF中的数据,并根据协议解析数据。

大家也看到了,每次收到一个字节数据就会产生一个中断,我感觉比较占用CPU资源,所以想用DMA处理。但是我有一个疑问:
(1)采用DMA处理时,数据可由DMA控制器直接放在串口接收BUFF中,但是不知道当前BUFF已经写到哪个位置,也不知道读到哪个位置,如果还采用上面的定时读取BUFF的方法,不知道从哪个地址开始读啊



求大神指导

最佳答案

楼主你好! DMA其实传输结束后也可以产生中断,可以用来跟踪具体传输情况,传输到串口的BUFF,其实就是直接放到发送寄存器中去。我不知道你UART是否使用FIFO,你说的BUFF写到哪个位置是什么意思? ...
回复

使用道具 举报

该用户从未签到

10

主题

68

帖子

0

中级会员

Rank: 3Rank: 3

积分
213
最后登录
2018-10-31
 楼主| 发表于 2017-8-11 10:31:40 | 显示全部楼层
居然没有一个人来
回复 支持 反对

使用道具 举报

该用户从未签到

734

主题

6393

帖子

0

超级版主

Rank: 8Rank: 8

积分
26032
最后登录
2025-10-27
发表于 2017-8-11 17:17:06 | 显示全部楼层
楼主你好!
DMA其实传输结束后也可以产生中断,可以用来跟踪具体传输情况,传输到串口的BUFF,其实就是直接放到发送寄存器中去。我不知道你UART是否使用FIFO,你说的BUFF写到哪个位置是什么意思?
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

68

帖子

0

中级会员

Rank: 3Rank: 3

积分
213
最后登录
2018-10-31
 楼主| 发表于 2017-8-12 23:17:41 | 显示全部楼层
小恩GG 发表于 2017-8-11 17:17
楼主你好!
DMA其实传输结束后也可以产生中断,可以用来跟踪具体传输情况,传输到串口的BUFF,其实就是直接 ...

自己定义的BUFF,在RAM中。
因为串口接收的其实就是二进制数据,具体代表什么意思,还要根据具体协议解析才行。
所以我就是中断接收放进BUFF中,主循环定时去读BUFF解析数据
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

68

帖子

0

中级会员

Rank: 3Rank: 3

积分
213
最后登录
2018-10-31
 楼主| 发表于 2017-8-12 23:22:21 | 显示全部楼层
小恩GG 发表于 2017-8-11 17:17
楼主你好!
DMA其实传输结束后也可以产生中断,可以用来跟踪具体传输情况,传输到串口的BUFF,其实就是直接 ...

这个BUFF其实就是一个循环队列,记录着写位置与读位置,中断写BUFF数据时更改写位置,主循环解析BUFF数据时更改读位置。

但是如果用DMA接收,就没有记录写位置与读位置了,不知道这种情况该怎么处理了
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

68

帖子

0

中级会员

Rank: 3Rank: 3

积分
213
最后登录
2018-10-31
 楼主| 发表于 2017-8-17 14:16:58 | 显示全部楼层
自己想到了一个办法解决了。有两种方法解决:
(1)读取DMA地址寄存器地址,然后减去接收缓存BUFF地址就知道当前写buff的地址了
(2)读取Current Major Iteration Count与Starting Major Iteration Count,两个值想减就可以到的写缓存BUFF的地址了


知道了写BUFF的地址,自己定义一个读地址,就可以定位读出新接收的数据了。
TIM图片20170817141439.png
回复 支持 反对

使用道具 举报

该用户从未签到

734

主题

6393

帖子

0

超级版主

Rank: 8Rank: 8

积分
26032
最后登录
2025-10-27
发表于 2017-8-17 15:14:01 | 显示全部楼层
贪恋新手 发表于 2017-8-17 14:16
自己想到了一个办法解决了。有两种方法解决:
(1)读取DMA地址寄存器地址,然后减去接收缓存BUFF地址就 ...

感谢楼主的解决方案分享!
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

10

帖子

0

注册会员

Rank: 2

积分
67
最后登录
2019-12-13
发表于 2018-1-7 13:53:18 | 显示全部楼层
贪恋新手 发表于 2017-8-17 14:16
自己想到了一个办法解决了。有两种方法解决:
(1)读取DMA地址寄存器地址,然后减去接收缓存BUFF地址就 ...

楼主,能否把你这个工程发给我参考参考呢?正需要这样的例子
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

68

帖子

0

中级会员

Rank: 3Rank: 3

积分
213
最后登录
2018-10-31
 楼主| 发表于 2018-1-15 10:18:51 | 显示全部楼层
xiang90721 发表于 2018-1-7 13:53
楼主,能否把你这个工程发给我参考参考呢?正需要这样的例子

前段时间重装系统,很多文件都没有了,你可以加我QQ一起交流。954065178
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-10-27 20:40 , Processed in 0.148283 second(s), 31 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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