打印
[STM32F0]

HAL库的串口DMA操作方法很难理解,非常的不好用

[复制链接]
1986|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tempchar|  楼主 | 2016-6-12 10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用HAL库做个单工的无线串口,因为无线通信是阻塞的,就用串口的DMA接收函数HAL_UART_Receive_DMA。

实际用的时候发现很多问题:
1.串口接收一旦溢出就会丢数据。
例如串口接收满了,稍等几秒再启动新的DMA接收函数HAL_UART_Receive_DMA时,就丢失数据了,而且是再也收不到串口数据。如果接满后马上启动就没这个问题。
看官方示例代码,停止DMA接收后似乎要DeInit后重新初始化Init和启动DMA接收

2.串口DMA接收不能单独停止。
例如串口同时在DMA发送和DMA接收,DMA接收到一半我要终止DMA的话,只能调用HAL_UART_DMAStop把接收DMA和串口DMA都停止。
换言之,不能单独停止DMA接收。
我理解的接收DMA和发送DMA是两个独立的操作,为什么不能单独停止?


大家有没有类似的经验,应当怎样规避这些坑?
还是说我的做法和理解其实是有问题的?有错误的请大家批评指正,一起学习提高
沙发
598330983| | 2016-6-12 15:31 | 只看该作者
就是这样的

使用特权

评论回复
板凳
xmshao| | 2016-6-12 17:27 | 只看该作者
串口满了还要稍等几秒开启新的DMA? 为什么要这样?

收发是不同的通道,可以单独配置。既然可以单独开启就可以单独关闭。那个 HAL_UART_DMAStop()里面是同时对TX/RX的DMA请求关闭的,你点进去看看。

使用特权

评论回复
地板
tempchar|  楼主 | 2016-6-13 08:32 | 只看该作者

听说以后官方都尽量以HAL库为主,接口这么不灵活怎么用啊
有没有什么办法绕过去?

使用特权

评论回复
5
tempchar|  楼主 | 2016-6-13 08:37 | 只看该作者
xmshao 发表于 2016-6-12 17:27
串口满了还要稍等几秒开启新的DMA? 为什么要这样?

收发是不同的通道,可以单独配置。既然可以单独开启就 ...

用的双缓冲,有时候nRF24L01+发得慢,两个缓冲区就都满了。这种情况通常会等几秒等到一个缓冲区空闲出来才开启新的DMA。

我也觉得应该有单独关闭RX DMA的接口。
但是看了下,HAL_UART_DMAStop是同时关闭TX和RX的,没有单独关闭RX的选项。
这个函数里不管huart->State是HAL_UART_STATE_BUSY_TX还是HAL_UART_STATE_BUSY_RX或HAL_UART_STATE_BUSY_TX_RX,都会直接设置成HAL_UART_STATE_READY。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

13

帖子

0

粉丝