OpenEdv-开源电子网

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

请教关于 HAL库 多串口 DMA接收 的问题

[复制链接]

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
发表于 2017-10-22 14:39:16 | 显示全部楼层 |阅读模式
10金钱
我参考了网上的UART+IDLE+DMA的例程,使用串口空闲中断实现DMA接收。

串口1单独DMA接收可以实现,串口2单独DMA接收也可以。但是两个串口一起开启DMA接收就会出现:


串口1接收正常,串口2开始接收,串口2无数据,串口1在正常数据后面出现乱码部分。


我猜测:是两路公用一个缓冲区是否需要清缓冲区?还是同一时间只能一个DMA通道可以运行呢?


如何协调才能使多串口DMA接收成功(不需要发送)呢?请各位大神指点一二。(我是用的是STM32F429的板子用的是HAL库)

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

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-10-23 09:36:09 | 显示全部楼层
你自己不也是说了吗,是两路公用一个缓冲区导致的问题,解决办法时分开使用各自存储
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3565
金钱
3565
注册时间
2016-1-8
在线时间
543 小时
发表于 2017-10-23 11:14:42 | 显示全部楼层
是不是通道弄错了,看看串口1 2你配置的是几通道
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-23 14:53:43 | 显示全部楼层
lanlzp 发表于 2017-10-23 09:36
你自己不也是说了吗,是两路公用一个缓冲区导致的问题,解决办法时分开使用各自存储

这个我也不确定
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-23 14:59:27 | 显示全部楼层
Sun_Fly 发表于 2017-10-23 11:14
是不是通道弄错了,看看串口1 2你配置的是几通道

串口1是DMA2_Stream2_CHANNEL_4,串口6是DMA2_Stream2_CHANNEL_5,好像没问题
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-23 15:00:36 | 显示全部楼层

主要是HAL跟标准库的差别挺大的,HAL的没有自定义接收地址的地方,貌似得调用HAL_UART_Receive_DMA(huart,USART1_RX_BUF,USART_REC_LEN);这个函数才能接收
回复

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2017-10-23 15:11:56 | 显示全部楼层
你猜啊  猜对了就告诉你
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3565
金钱
3565
注册时间
2016-1-8
在线时间
543 小时
发表于 2017-10-23 16:05:41 | 显示全部楼层
talenthn 发表于 2017-10-23 14:59
串口1是DMA2_Stream2_CHANNEL_4,串口6是DMA2_Stream2_CHANNEL_5,好像没问题

慢慢找原因
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-10-24 08:43:27 来自手机 | 显示全部楼层
为什么要共用一个缓冲?如果是分割组合也应该分区处理吧?
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-24 11:19:46 | 显示全部楼层
l6931639 发表于 2017-10-24 08:43
为什么要共用一个缓冲?如果是分割组合也应该分区处理吧?

嗯嗯,主要是HAL的DMA不太好懂
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-10-24 16:04:58 来自手机 | 显示全部楼层
hal的回调函数都是集成处理的,你要用if来区分是哪个串口发生的中断。如果熟练,用寄存器大法好很多。
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-24 16:25:41 | 显示全部楼层
l6931639 发表于 2017-10-24 16:04
hal的回调函数都是集成处理的,你要用if来区分是哪个串口发生的中断。如果熟练,用寄存器大法好很多。

哦哦哦,感谢感谢,我看一下
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-24 16:26:11 | 显示全部楼层
l6931639 发表于 2017-10-24 16:04
hal的回调函数都是集成处理的,你要用if来区分是哪个串口发生的中断。如果熟练,用寄存器大法好很多。

对了,请教一下接收串口数据是用空闲中断好点还是用DMA中断好点呢
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-10-24 17:51:40 来自手机 | 显示全部楼层
talenthn 发表于 2017-10-24 16:26
对了,请教一下接收串口数据是用空闲中断好点还是用DMA中断好点呢

各有好处,一般定长的数据直接用dma中断我个人觉得方便些
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-24 20:08:11 | 显示全部楼层
l6931639 发表于 2017-10-24 17:51
各有好处,一般定长的数据直接用dma中断我个人觉得方便些

好的,多谢,我试试
回复

使用道具 举报

260

主题

809

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1896
金钱
1896
注册时间
2012-10-28
在线时间
357 小时
发表于 2017-10-24 22:13:29 | 显示全部楼层
talenthn 发表于 2017-10-23 14:59
串口1是DMA2_Stream2_CHANNEL_4,串口6是DMA2_Stream2_CHANNEL_5,好像没问题

估计问题貌似就在这里了,

DMA2_Stream2_CHANNEL_4,串口6是DMA2_Stream2_CHANNEL_5

如果通道4使用了DMA2_Stream2_这个,
那么通道5貌似就不能够再使用 DMA2_Stream2_ 了吧 ???

否则会发送冲突的,你把这个看能否分开试试看看,比如 通道4选择 DMA2_Stream2_
那么通道5 选择 DMA2_Stream3 测试看看 ?
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-25 08:46:27 | 显示全部楼层
hpdell 发表于 2017-10-24 22:13
估计问题貌似就在这里了,

DMA2_Stream2_CHANNEL_4,串口6是DMA2_Stream2_CHANNEL_5

是的是的,昨晚调出来了,确实不能一个stream
回复

使用道具 举报

13

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-11-1
在线时间
50 小时
 楼主| 发表于 2017-10-25 08:46:45 | 显示全部楼层
hpdell 发表于 2017-10-24 22:13
估计问题貌似就在这里了,

DMA2_Stream2_CHANNEL_4,串口6是DMA2_Stream2_CHANNEL_5

感谢感谢
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-11-24
在线时间
11 小时
发表于 2017-11-24 19:45:04 | 显示全部楼层
求传一个用hal库实现的单路串口DMA IDLE中断收发代码,感激不尽
回复

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2017-11-24 19:53:38 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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