OpenEdv-开源电子网

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

串口DMA发送+DMA发送完成中断

[复制链接]

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
发表于 2020-4-2 13:10:38 | 显示全部楼层 |阅读模式
1.有哪位老铁使用串口DMA发送过数据,并且采用中断的方式判断数据是否发送完成,原子哥的是一直在while  循环中判断,这样太浪费资源了。大神做过的分享一下吧。
/*
while(1)
      {
                if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7))//等待DMA2_Steam7传输完成
                {
                    __HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志
                    HAL_UART_DMAStop(&UART1_Handler);      //传输完成以后关闭串口DMA
     break;
                }
    pro=__HAL_DMA_GET_COUNTER(&UART1TxDMA_Handler);//得到当前还剩余多少个数据
    pro=1-pro/SEND_BUF_SIZE;    //得到百分比   
    pro*=100;             //扩大100倍
    LCD_ShowNum(30,170,pro,3,16);     
      }
*/
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

108

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-10-31
在线时间
155 小时
发表于 2020-4-3 09:17:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
 楼主| 发表于 2020-4-3 09:21:21 | 显示全部楼层
lt1394466592 发表于 2020-4-3 09:17
开DMA传输完成中断

我调用了HAL_UART_Transmit_DMA(&UART5_Handler,(uint8_t *)pData,Size); 这个函数,只能发送成功一次,后面仿真结果来看一直显示DMA状态忙,网上说的我也试了,情况还是这样,
回复 支持 反对

使用道具 举报

31

主题

108

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-10-31
在线时间
155 小时
发表于 2020-4-3 09:56:32 | 显示全部楼层
明天,你好 发表于 2020-4-3 09:21
我调用了HAL_UART_Transmit_DMA(&UART5_Handler,(uint8_t *)pData,Size); 这个函数,只能发送成功一次, ...

没用过HAL,发数据直接开串口的TC中断,然后到中断函数里读DMA数据区,有数据就开启DMA传输,设置DMA传输数据大小,没有数据就把TC中断关闭就行了
回复 支持 反对

使用道具 举报

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
 楼主| 发表于 2020-4-3 10:10:41 | 显示全部楼层
lt1394466592 发表于 2020-4-3 09:56
没用过HAL,发数据直接开串口的TC中断,然后到中断函数里读DMA数据区,有数据就开启DMA传输,设置DMA传输数据 ...

你是用的F429这样做的吗
回复 支持 反对

使用道具 举报

31

主题

108

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-10-31
在线时间
155 小时
发表于 2020-4-3 10:36:05 | 显示全部楼层
明天,你好 发表于 2020-4-3 10:10
你是用的F429这样做的吗

我的是F407,都差不多
回复 支持 反对

使用道具 举报

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
 楼主| 发表于 2020-4-3 10:49:16 | 显示全部楼层
lt1394466592 发表于 2020-4-3 10:36
我的是F407,都差不多

能发一下你串口部分的程序吗?方便的话发一下工程
回复 支持 反对

使用道具 举报

25

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
468
金钱
468
注册时间
2017-6-10
在线时间
66 小时
 楼主| 发表于 2020-4-3 10:51:45 | 显示全部楼层
明天,你好 发表于 2020-4-3 10:49
能发一下你串口部分的程序吗?方便的话发一下工程

还有一个问题,你开了串口的发送完成中断,却在完成中断里又读DMA的数据区,开始DMA传输,串口都已经进了发送完成中断了,为什么还要DMA传输(方向:内存到外设)
回复 支持 反对

使用道具 举报

31

主题

108

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-10-31
在线时间
155 小时
发表于 2020-4-3 11:22:00 | 显示全部楼层
明天,你好 发表于 2020-4-3 10:51
还有一个问题,你开了串口的发送完成中断,却在完成中断里又读DMA的数据区,开始DMA传输,串口都已经进了 ...

我这边是Tx指令一个数据区,然后DMA传输一个数据区,发送的时候先写入Tx_FIFO,然后对里面的进行读取发送,所以在中断里会多次打开
回复 支持 反对

使用道具 举报

31

主题

108

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-10-31
在线时间
155 小时
发表于 2020-4-3 11:31:18 | 显示全部楼层
明天,你好 发表于 2020-4-3 10:51
还有一个问题,你开了串口的发送完成中断,却在完成中断里又读DMA的数据区,开始DMA传输,串口都已经进了 ...

因为我用了FIFO来缓冲发送和接收数据,所以会在中断中再判断是否还需要继续发送(两个缓冲区大小跟DMA缓冲区大小不一样);
代码大概是配置好串口和DMA(DMA发送方向从内存到外设)
然后发送数据的时候把数据写入DMA缓冲区
设置好DMA计数值DMA_SetCurrDataCounter
清空DMA标志,启动DMA发送
最后打开串口发送完成中断
回复 支持 反对

使用道具 举报

17

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-1-15
在线时间
39 小时
发表于 2020-4-20 14:18:30 | 显示全部楼层
设计思路:
1、UART中断:开启TC(传输完成)中断和IDLE(总线空闲)中断;
2、DMA中断:收发中断均不开启。
接收端设计思路:
初始化完成后,就开启DMA_RX,开启IDLE中断;
开启后CPU不用理会,DMA会在搬运串口数据到指定内存。
当收到一帧数据后(以停止位为标记),进入idle中断,在中断函数内部,清掉中断位,停止DMA收,重启DMA收。
————————————————

完整的代码我传这里了
https://gitee.com/xixihaha_is_fo ... E_TX-TC/cubeMX_TEST
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-2 07:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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