OpenEdv-开源电子网

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

关于STM32 DMA 问题

[复制链接]

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-3-31
在线时间
13 小时
发表于 2018-4-1 22:24:16 | 显示全部楼层 |阅读模式
1金钱
使用DMA通过串口1发送数据,等发完之后,能不能有什么方法进入串口一发送完成中断。

最佳答案

查看完整内容[请看2#楼]

串口中断只能一个字节进入一次。所以dma传输的 时候,不要用串口中断,这样比较省cpu,如果要串口中断,还不如不用dma
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-1 22:24:17 | 显示全部楼层
串口中断只能一个字节进入一次。所以dma传输的 时候,不要用串口中断,这样比较省cpu,如果要串口中断,还不如不用dma
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-4-1 23:06:03 | 显示全部楼层
进串口中断干嘛呢?dma有个完成中断,应该可以吧
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-3-31
在线时间
13 小时
 楼主| 发表于 2018-4-2 08:51:00 | 显示全部楼层
正点原子 发表于 2018-4-1 22:24
串口中断只能一个字节进入一次。所以dma传输的 时候,不要用串口中断,这样比较省cpu,如果要串口中断,还 ...

1.用的485,发完之后需要设置为接受模式,如果DMA发完就中断关闭的话,最后一帧发不出去。
2.串口的发送中断,不是应该发完你所设置的长度才会进入中断吗,怎么你说一字节进一次。
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2018-1-23
在线时间
61 小时
发表于 2018-4-2 11:15:16 | 显示全部楼层
武安君 发表于 2018-4-2 08:51
1.用的485,发完之后需要设置为接受模式,如果DMA发完就中断关闭的话,最后一帧发不出去。
2.串口的发送 ...

1、可以开一个标志,发完之后。延时一下在进入接受模式。
2、STM32的串口没有FIFO,只能发一字节进入一次。
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-4-2 11:22:01 | 显示全部楼层
DMA中断,有的
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1768
金钱
1768
注册时间
2015-6-11
在线时间
312 小时
发表于 2018-4-2 11:23:33 | 显示全部楼层
DMA传输结束到USART发送完毕,会有时间差的,你可以在DMA中断里面加个USART发送完成检测就可以了,我这个经过项目检验的,长期运行都没出问题
       while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
        {        
        }
        
        
        RS_485_RX_EN;
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-4-2 11:24:42 | 显示全部楼层
武安君 发表于 2018-4-2 08:51
1.用的485,发完之后需要设置为接受模式,如果DMA发完就中断关闭的话,最后一帧发不出去。
2.串口的发送 ...

stm32串口发送中断有两种,一种是TC 一种TXE,你最好去看一看
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-4-2 11:28:19 | 显示全部楼层
武安君 发表于 2018-4-2 08:51
1.用的485,发完之后需要设置为接受模式,如果DMA发完就中断关闭的话,最后一帧发不出去。
2.串口的发送 ...

1.对于串口硬件本身来说,最小发送单位是是单个字节,不是单个帧;
2.DMA可以之间一帧扔进去 ,交给硬件处理,这就是dma可以减轻cpu压力的原因
3.dma你的操作应该还存在一些问题
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-3-31
在线时间
13 小时
 楼主| 发表于 2018-4-2 12:35:03 | 显示全部楼层
bihaha 发表于 2018-4-2 11:15
1、可以开一个标志,发完之后。延时一下在进入接受模式。
2、STM32的串口没有FIFO,只能发一字节进入一 ...

一字节进一次中断的话,HAL库里发送函数HAL_UART_Transmit_IT(),入口参数中的长度干什么用,不是应该长度到达之后才会进入中断吗?
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2018-1-23
在线时间
61 小时
发表于 2018-4-2 14:14:34 | 显示全部楼层
武安君 发表于 2018-4-2 12:35
一字节进一次中断的话,HAL库里发送函数HAL_UART_Transmit_IT(),入口参数中的长度干什么用,不是应该长 ...

你去看这个函数的实现方式;里面有husart->TxXferCount = Size;和 /* Enable the USART Transmit Data Register Empty Interrupt */
    __HAL_USART_ENABLE_IT(husart, USART_IT_TXE);
在中断服务函数里面有 husart->TxXferCount--;

初开始学习的话,不建议使用HAL开发,出了问题不好查找。
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-3-31
在线时间
13 小时
 楼主| 发表于 2018-4-2 21:06:14 | 显示全部楼层
bihaha 发表于 2018-4-2 14:14
你去看这个函数的实现方式;里面有husart->TxXferCount = Size;和 /* Enable the USART Transmit Data Re ...

这个回答很有用。老司机
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 02:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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