OpenEdv-开源电子网

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

usart1实现DMA的发送和接收功能,出现的接收问题

[复制链接]

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
发表于 2013-3-5 22:14:07 | 显示全部楼层 |阅读模式
小弟刚上手stm32不久,我现在搞了一个用usart1实现了DMA的发送和接收功能。已经成功了,但是我设置的是一次接收32

个字符,如果接收的超过或者少于32个字符,就会出现问题,就无法接收了(我们实现的是用ZigBee无线传输,一次定义32

个字符为一个数据包,但是就怕zigbee的接收的问题,使得DMA无法收到定义好的32个字符,这样就会无法完成后续的任务



我的思路是这样的:
1.先配置USART1的时钟以及相应的GPIO,初始化USART1,使能USART1;
2.0使能DMA时钟
2.1配置DMA发送:
----配置DMA发送中断(DMA1_Channel4)
----DMA发送设置,DMA_BufferSize设为32,都是8bit(DMA_PeripheralDataSize_Byte,DMA_MemoryDataSize_Byte),DMA_Mode为循环模式,然后:
        DMA_Cmd (DMA1_Channel4,ENABLE);        
        DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); 
2.2配置DMA接收:
----配置DMA接收中断(DMA1_Channel5)
----DMA接收设置,DMA_BufferSize设为32,都是8bit(DMA_PeripheralDataSize_Byte,DMA_MemoryDataSize_Byte),DMA_Mode为循环模式,然后:
        DMA_Cmd (DMA1_Channel5,ENABLE);        
        DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE); 
2.3串口向 DMA发出请求(先让DMA接收,接收到了在发送)
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
3.1在DMA接收中断函数中(void DMA1_Channel5_IRQHandler(void))
----如果接收完成 //if(DMA_GetFlagStatus(DMA1_FLAG_TC5)==SET)
----就先给一个全局变量flag=1(为了在main函数中的循环里识别)
----再关闭串口的DMA接收请求  //USART_DMACmd(USART1, USART_DMAReq_Rx, DISABLE);
----清除标志        //DMA_ClearFlag(DMA1_FLAG_TC5);
3.2在main函数的while循环中 如果发现flag==1,说明接收完成,可以传想要传输的数据了;
----于是,打开串口的DMA发送请求  //USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);        
----同时flag=0
3.3在DMA发送中断函数中(void DMA1_Channel4_IRQHandler(void))
----如果发送完成  //if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
----就关闭串口的DMA发送请求,再打开串口的DMA接收请求:
        USART_DMACmd(USART1, USART_DMAReq_Tx, DISABLE);
        USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
----清除标志        //DMA_ClearFlag(DMA1_FLAG_TC4);
//////////////////////////////////////////////////////////////////////////////////////////////
这就是整个函数,函数实现的很好,接了32个字符(PC给stm32 发送32个字符),马上就发回32个字符,看似已经ok,但是遇到两种蛋疼的情况:

1.pc给stm32 发送的字符少于32个;
2.发送的多于32个;
这样都会导致,stm32无法在继续接收和发送字符了,即使我在向stm32发送正确的32个字符,必须复位才行,这样的话,我们的stm32就无法接收后续的数据了,这怎么办,我想了让它在先关闭串口的DMA请求,在打开,可惜还是不行,请求高人解答。
希望高人谈一下引起这种情况的原因,以及详细的解答方案,最好能有关键性的代码和解释。
谢谢。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-9 00:26:58 | 显示全部楼层
回复【13楼】humanking7:
---------------------------------
和你的文件无关,不过你要可靠传输,就必须做协议了,做应答确认.否则大文件传输,多少会出错.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-6 15:54:32 | 显示全部楼层
没有人回答吗,原子哥求接
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-6 16:08:03 | 显示全部楼层
可以加个超时检测, 比如,空闲时间超过发送一个字节时间的N倍的时候,DMA重新初始化接收,指针复位。
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-6 17:48:09 | 显示全部楼层
回复【3楼】aleda303:
---------------------------------
大侠,终于等到了,就是这个,但有两个问题,我不清楚
1.怎么检测空闲时间;
2.(最重要的是)如何DMA重新初始化接收,指针复位。(这个我自己也尝试过,但都失败了,我对一些具体操作还是有点不清楚)
能不能帮我写一些核心代码,就是接收问题,谢谢您
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-6 21:14:23 | 显示全部楼层
我一直觉得DMA不太适合这种接收,所以我的都是用中断做的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-6 23:10:28 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥能给我回复我已经很满意了。原子哥有没有DMA这样比较深入一点的资料,我想好好研究一下,我们要做一个学校的课余项目,这个dma这个接收如果用好了的话很节省资源,毕竟还要在开辟一个串口进行收发,两个串口,我怕处理起来有点吃力。
再次感谢原子哥,嘿嘿
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-7 00:15:23 | 显示全部楼层
回复【6楼】humanking7:
---------------------------------
我比较喜欢DMA发送,不喜欢用DMA接收.
如果你一定要用的话,aleda303 也说了,你开个定时器,定时检测DMA计数寄存器里面的值,超过一定时间没有变化,就认为接收结束了.

不过我认为此种方法,还不如就用中断接收得了.
我们的蓝牙模块代码就是用的这种方法,你可以参考下.
搜索:蓝牙模块
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-7 08:41:45 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
其实实际应用的时候 我接收的 时候 也不用DMA,只用中断 发送要用DMA
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-7 23:16:14 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
谢谢原子哥
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-7 23:16:34 | 显示全部楼层
回复【8楼】aleda303:
---------------------------------
谢谢aleda303
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-7 23:37:31 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,我搜了蓝牙模块,没有想要的,你写的不完全参考手册也看了,都没有,能不能劳您给发个链接,再拜谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-7 23:52:40 | 显示全部楼层
回复【11楼】humanking7:
---------------------------------
http://www.openedv.com/posts/list/12486.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-8 23:29:24 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
谢了原子哥,弱弱地问一句,如果要给板子发送其他文件类型,比如MP3,*doc,*.ppt等等,这些,可以吗,接收程序是不是很高端了?如果可行的话这个的大体思路是啥?
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2013-3-5
在线时间
1 小时
 楼主| 发表于 2013-3-10 00:21:30 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
哦,原来如此,原子哥真是知无不言啊,真好
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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