搜索
bottom↓
回复: 18

STM32 串口空闲中断接收+DMA的实现方法

[复制链接]

出0入0汤圆

发表于 2017-4-28 12:06:56 | 显示全部楼层 |阅读模式
本帖最后由 circle_head 于 2017-4-28 16:31 编辑

转载+自己的理解   附件内容是 DMA的配置 + 串口的配置   不是工程文件
        
        STM32中,一般使用串口中断接收串口数据,但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32也是支持

的。但是关键的一点,怎么知道数据接收完毕了呢?如果接收的数据长度固定,那就好办,直接设置DMA的接收数据个数就行了。但是如果长度不固定了,那应该怎么办了?

       这个时候,就要用到STM32在串口中提供的另一个好用的东西了,就是串口空闲中断。在STM32的串口控制器中,设置了有串口空闲中断,即如果串口空闲,又开启了串口空闲中断

的话,就触发串口空闲中断,然后程序就会跳到串口中断去执行。有了这个,是不是可以判断什么时候串口数据接收完毕了呢?因为串口数据接收完毕后,串口总线肯定是会空闲的嘛,

那这个中断肯定是会触发的了。    需要注意的是:要RXNE位被置位后,串口总线空闲才会触发的


使用过程中只需在主函数中
1、定义接收数组
u8 RxBuff[Data_Leng];

2、配置DMA          
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)RxBuff, DMA_DIR_PeripheralSRC, 30); //DMA1 通道5 ,外设串口1,存储器为RxBuff,DMA传输方向,DMA长度

3、配置串口
uart_init(9600);         

接收完成数据后 就可以在中断中解析数据  执行相应的操作了。

关于中断函数中 清除空闲标志位  解释如图1 状态寄存器 所示

关于中断函数中 先Disable DMA通道  然后设置DMA传输数目 最后Enable DMA通道的做法  解释如图2 DMA通道 所示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-4-28 12:33:00 | 显示全部楼层
楼主有没有测试过,对方发送的数据不是很连续的,就是说,对方发送数据是一个一个发送的,字节之间有间隔的,小于一个字节
这样空闲中断接收每个字节之后都有一个空闲中断发生,

出100入85汤圆

发表于 2017-4-28 12:39:46 来自手机 | 显示全部楼层
这种方式适合modbus这类按桢处理的情况

出0入0汤圆

发表于 2017-4-28 12:43:47 | 显示全部楼层
感谢楼主分享自己的心得!

出0入0汤圆

发表于 2017-4-28 13:54:02 来自手机 | 显示全部楼层
我这么接收gps信息的,处理很轻松。

出0入0汤圆

 楼主| 发表于 2017-4-28 16:29:01 | 显示全部楼层
xiaomu 发表于 2017-4-28 12:33
楼主有没有测试过,对方发送的数据不是很连续的,就是说,对方发送数据是一个一个发送的,字节之间有间隔的 ...

程序是没问题的我测过的      接收的数据有间隔就会进中断的, 这个间隔多少时间会产生中断我也没测过。

出0入0汤圆

 楼主| 发表于 2017-4-28 16:30:18 | 显示全部楼层
whatcanitbe 发表于 2017-4-28 12:39
这种方式适合modbus这类按桢处理的情况

  嗯,是的 ,  但是modbus 是检测超时接收的啊。

出0入0汤圆

发表于 2017-4-28 16:39:16 来自手机 | 显示全部楼层
顶,。。。。。。。。

出0入0汤圆

发表于 2017-4-28 16:52:43 来自手机 | 显示全部楼层
最近我把所有串口dma接收的方式都试过了,还是dma+fifo的方式最靠谱,最踏实,用stm32f4操作4g模块的at命令,没有任何毛病,当然我是在ucos 的情况下试的,裸奔估计都差不多,上系统地话对接缓冲最稳定可靠。

出0入10汤圆

发表于 2017-4-28 17:33:15 来自手机 | 显示全部楼层
能用来接收xmoderm协议数据吗

出0入0汤圆

发表于 2017-4-28 18:00:44 来自手机 | 显示全部楼层
F1有空闲中断吗?

出100入85汤圆

发表于 2017-4-28 18:06:14 来自手机 | 显示全部楼层
本帖最后由 whatcanitbe 于 2017-4-29 17:05 编辑
zsfddd 发表于 2017-4-28 18:00
F1有空闲中断吗?


103vbt6就有

出100入101汤圆

发表于 2017-4-28 21:35:02 | 显示全部楼层
学习了,顶一下

出0入0汤圆

发表于 2017-4-28 21:58:28 | 显示全部楼层
多谢楼主分享.

出0入0汤圆

发表于 2017-4-29 22:40:17 | 显示全部楼层
谢谢楼主,学习了

出0入0汤圆

发表于 2017-5-17 11:02:43 | 显示全部楼层
打开了,不是整个工程,不过我已经弄好了。串口DMA确实挺好用的

出0入8汤圆

发表于 2017-9-19 16:37:10 | 显示全部楼层
不用DMA  直接空闲中断加接收中断就可以实现一个完整串口帧的接收

出0入0汤圆

发表于 2018-8-22 15:38:49 | 显示全部楼层
接收中断。和空闲中断。要分清,没有接收中断,光空闲中断是可以利用dma来接收数据,有非阻塞发送的。类似gprs通信程序类

出0入0汤圆

发表于 2019-12-6 10:17:01 | 显示全部楼层
DMA + 双缓冲   断帧的问题 就由协议来处理了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 22:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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