关于HAL库中用DMA方式使用串口的问题,串口中断用开吗?

2019-12-27 18:47发布

关于HAL库中用DMA方式使用串口的问题,串口中断用开吗?

使用DMA模式收发串口的核心语句为如下2句
HAL_UART_Transmit_DMA
HAL_UART_Receive_DMA

我的问题:
1,使用DMA模式在cube中的NVIC中断选项中
dma的 interrupt是要enable的 也是默认的
但是usart 的global interrupt 的中断是否也要enable???

之所以问这个问题是因为,DMA模式的核心就是CPU尽量少的参与,由硬件来部分完成CPU的工作。
就那串口为例,
普通的串口收到一个byte就中断一次,CPU就要处理一次
而DMA模式串口收到了一组数据(比如100bytes)再产生中断,然后CPU再一次性处理。
CPU的工作从原来的100次减少到了1次。
但是如果enable的 usart 的global interrupt,那么是不是又变成了,收到一个byte就中断一次了?那DMA的意义就不大了。

2,DMA的callback回调函数是什么?
dma把收据收满了应该产生一个中断,我猜是DMA中断,而HAL库的中断一般是用回调函数处理的。
所以我的问题就出现了,串口DMA的中断回调函数是什么呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lusson
1楼-- · 2019-12-27 21:08
我用SPI的时候是不用开的。
zhang_mike2000
2楼-- · 2019-12-27 21:28
 精彩回答 2  元偷偷看……
zengyi
3楼-- · 2019-12-27 23:12
本帖最后由 zengyi 于 2016-11-8 17:10 编辑

如果不设置类似UART_FLAG_RXNE这样的标志位,串口不会收到一个字节就进一次中断。

比较流行的方式是通过DMA+IDLE标志中断来进行数据接收。

自动生成的串口处理程序,是对各种标志位的处理。如果没有设置的话,就是直接跳过了,至于为什么会进中断完全是因为设置了其他标志位造成的。
DMA的中断程序是针对传输完成、传输一半和传输错误的处理。
结合参考手册比较容易看明白。
一天的蓝
4楼-- · 2019-12-28 00:24
hal的hal_usart_dma_start函数通过dma_start_it这类函数启动,中断清标志位 调用callback,用自己不带it的dma_start函数启动就可以了
zhang_mike2000
5楼-- · 2019-12-28 02:30
一天的蓝 发表于 2016-11-9 09:08
hal的hal_usart_dma_start函数通过dma_start_it这类函数启动,中断清标志位 调用callback,用自己不带it的d ...

能再说的具体一点吗?
比如
中断清标志位 调用callback,调用哪个callback?
串口的global interrupt是否要打开?
weidadejang
6楼-- · 2019-12-28 07:54
HAL库有太多坑!

一周热门 更多>