社区导航

 
查看: 604|回复: 13

[求助] stm32串口怎么用DMA接收不定长数据

[复制链接]

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-7-10 21:46:51 | 显示全部楼层 |阅读模式
stm32串口怎么用DMA接收不定长数据,求大神点播
1. 网上查到,空闲中断+DMA可以接收不定长数据,但是看了好多,只是知道空闲中断里面可以得到缓存器剩余数据量,从而可以求出已经接收的数据量。然后就没了,那么怎么实现不定长接收呢?
2. 缓存区并不能从头刷新,比如说,9个数据量的缓存,我传4个数,那么我下次传6个,这时候缓存器并不能从新从第一位开始刷新,而是接着存储,然后数据就乱了,所以并没有实现不定长接收。我想要不管传输多长字节都可以让缓存区从头开始缓存,这样并不知道怎么实现期待大神

3. 或者说我的思路是错的,DMA接收不定长数据应该用别的方式,有懂的大神帮忙说一下
此帖出自stm32/stm8论坛


回复

使用道具 举报

760

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-7-10 22:11:57 | 显示全部楼层
空闲中断+DMA   思路是对的,只是你还没有掌握精髓  有时间我分享一个

点评

那,大神,请问怎么清空DMA的缓存区?要用哪个函数或者哪种思路去清空?额,我用的是stm32标准库  详情 回复 发表于 2018-7-11 09:15
水不撩不知深浅 人不拼怎知输赢


回复

使用道具 举报

34

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-7-10 22:15:12 | 显示全部楼层
给你推荐个帖子吧,里边讲的很清楚了
STM32CUBE F407ZET6串口1通过DMA方式接收不定长数据

点评

嗯,谢谢,但是这个库为什么跟我用的不一样?功能一样么?  详情 回复 发表于 2018-7-11 08:40


回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-11 08:40:46 | 显示全部楼层
gyp1 发表于 2018-7-10 22:15
给你推荐个帖子吧,里边讲的很清楚了
STM32CUBE F407ZET6串口1通过DMA方式接收不定长数据

嗯,谢谢,但是这个库为什么跟我用的不一样?功能一样么?


回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-11 09:15:09 | 显示全部楼层
wo4fisher 发表于 2018-7-10 22:11
空闲中断+DMA   思路是对的,只是你还没有掌握精髓  有时间我分享一个

那,大神,请问怎么清空DMA的缓存区?要用哪个函数或者哪种思路去清空?额,我用的是stm32标准库

点评

清空接收可以disable掉dma然后赋值dma计数再enable,不清空也可以dma设置成循环模式记下上次结束位置就行了. 你说的那个空闲应该是串口中断,高档次的stm32才有,低端可以用定时器来实现.  详情 回复 发表于 2018-7-11 13:25


回复

使用道具 举报

3256

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-7-11 13:25:45 | 显示全部楼层
本帖最后由 huo_hu 于 2018-7-11 13:31 编辑
shijizai 发表于 2018-7-11 09:15
那,大神,请问怎么清空DMA的缓存区?要用哪个函数或者哪种思路去清空?额,我用的是stm32标准库

清空接收可以disable掉dma然后赋值dma计数再enable,不清空也可以dma设置成循环模式记下上次结束位置就行了,下次接收结束位置之差里的数据就是.
你说的那个空闲应该是串口中断,高档次的stm32才有,低端可以用定时器来实现.

点评

这是我在空闲中断中的关闭DMA再开启,这里写着,然后调试时就不好使[attachimg]363399[/attachimg]  详情 回复 发表于 2018-7-11 14:17
[attachimg]363395[/attachimg]这是我的DMA中断  详情 回复 发表于 2018-7-11 14:10
不知道为什么,我在主函数中直接disable掉dma然后赋值dma计数再enable就不可以,在DMA中断中就行。所以就只在DMA中断中关掉DMA再开启可以达到清空并重新接收,那么我要在DMA中断以外怎么清空?  详情 回复 发表于 2018-7-11 14:07


回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-11 14:07:31 | 显示全部楼层
huo_hu 发表于 2018-7-11 13:25
清空接收可以disable掉dma然后赋值dma计数再enable,不清空也可以dma设置成循环模式记下上次结束位置就行 ...

不知道为什么,我在主函数中直接disable掉dma然后赋值dma计数再enable就不可以,在DMA中断中就行。所以就只在DMA中断中关掉DMA再开启可以达到清空并重新接收,那么我要在DMA中断以外怎么清空?


回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-11 14:10:40 | 显示全部楼层
huo_hu 发表于 2018-7-11 13:25
清空接收可以disable掉dma然后赋值dma计数再enable,不清空也可以dma设置成循环模式记下上次结束位置就行 ...

1531289382(1).jpg 这是我的DMA中断


回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-11 14:17:49 | 显示全部楼层
huo_hu 发表于 2018-7-11 13:25
清空接收可以disable掉dma然后赋值dma计数再enable,不清空也可以dma设置成循环模式记下上次结束位置就行 ...

这是我在空闲中断中的关闭DMA再开启,这里写着,然后调试时就不好使 1531289779(1).jpg

点评

你调试一下dma的CMAR是不是也要修改,记不清楚了. 实在不行就不动dma,循环方式,CNDTR的数值和总buffersize做差就是当前数据位置  详情 回复 发表于 2018-7-11 16:03


回复

使用道具 举报

3256

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-7-11 16:03:23 | 显示全部楼层
本帖最后由 huo_hu 于 2018-7-11 16:04 编辑
shijizai 发表于 2018-7-11 14:17
这是我在空闲中断中的关闭DMA再开启,这里写着,然后调试时就不好使

你调试一下,看看dma的CMAR是不是也要修改,记不清楚了.
实在不行就不动dma,循环方式,CNDTR的数值和总buffersize做差就是当前数据位置


回复

使用道具 举报

3256

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-7-11 16:07:07 | 显示全部楼层
你那个TCIF0是dma传输完成标致,达不到你要的目标

点评

大神,我一直不知道DMA怎么关闭或者打开,很多时候在主函数或者别的中断里执行disable语句,调试的结果显示根本就关闭不了  详情 回复 发表于 2018-7-29 10:45

评分

1

查看全部评分



回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-29 10:45:10 | 显示全部楼层
huo_hu 发表于 2018-7-11 16:07
你那个TCIF0是dma传输完成标致,达不到你要的目标

大神,我一直不知道DMA怎么关闭或者打开,很多时候在主函数或者别的中断里执行disable语句,调试的结果显示根本就关闭不了

点评

就是那个disable就行,只不过调试的时候有个时间差,实际上是没问题的. 另外停止dma只是切断adc到dma的触发,如果adc处于连续模式adc并不会停止,你再次启动dma的时候(多通道)可能有个数据对齐的问题.  详情 回复 发表于 2018-7-29 12:29


回复

使用道具 举报

3256

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-7-29 12:29:20 | 显示全部楼层
本帖最后由 huo_hu 于 2018-7-29 12:31 编辑
shijizai 发表于 2018-7-29 10:45
大神,我一直不知道DMA怎么关闭或者打开,很多时候在主函数或者别的中断里执行disable语句,调试的结 ...

就是那个disable就行,只不过调试的时候有个时间差,实际上是没问题的,停止后dma的cnt不变化.
另外停止dma只是切断adc到dma的触发,如果adc处于连续模式adc并不会停止,你再次启动dma的时候(多通道)可能有个数据对齐的问题.

点评

哦哦哦  详情 回复 发表于 2018-7-29 13:07


回复

使用道具 举报

271

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-29 13:07:32 | 显示全部楼层
huo_hu 发表于 2018-7-29 12:29
就是那个disable就行,只不过调试的时候有个时间差,实际上是没问题的,停止后dma的cnt不变化.
另外停止dma ...

哦哦哦


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-20 04:07 , Processed in 0.365834 second(s), 17 queries , Gzip On, MemCache On.

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