完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
最近用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是两个独立的操作,为什么不能单独停止? 大家有没有类似的经验,应当怎样规避这些坑? 还是说我的做法和理解其实是有问题的?有错误的请大家批评指正,一起学习提高 |
|
相关推荐
20个回答
|
|
|
当你将接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。要恢复正常的话就只有Deinit后再重新初始化串口,或者使用read接口直接将数据寄存器中的数据读走后,后面的数据才能正常进入,从而正常产生DMA请求,这个DMA请求是指硬件请求。
|
|
|
|
|
|
我刚做过用串口DMA接收不定长数据,使能空闲中断,在空闲中断触发的时候停止DMA,取出数据,之后使用HAL_UART_Receive_DMA重新接收没有问题。(没有DeInit和Init)
2,HAl的库函数HAL_UART_DMAStop确实是同时关收发DMA,如果只关一个的话可以直接操作寄存器。至于只关一个会不会出问题就不知道了; |
|
|
|
|
|
你应该用DMA中断将数据移到缓冲区
|
|
|
|
|
youpukeji668 发表于 2019-1-11 06:31 DMA停止后,HAL_UART_Receive_DMA执行前,如果串口有数据接收就会出问题。我测试时就是这种情况。 那我试试直接操作寄存器。多谢你的建议 |
|
|
|
|
|
|
|
|
|
|
充电搜索 发表于 2019-1-11 06:20 这下算是完全明白了,多谢多谢 |
|
|
|
|
|
谢谢分享,让我明白了
|
|
|
|
|
|
确实我在调试串口的时候也遇到了这个问题,串口dma回调函数只能进入一次,稍后我把问题解决了和大家一起分享吧
|
|
|
|
|
|
解决就好
|
|
|
|
|
|
谢谢分享
|
|
|
|
|
|
学习了,
|
|
|
|
|
|
你应该用DMA中断将数据移到缓冲区
|
|
|
|
|
|
|
|
|
|
|
youpukeji668 发表于 2019-1-11 06:31 哥,请问你怎么做的,能给段代码看看吗 |
|
|
|
|
|
|
|
|
二楼说的很好,原因就是如此。其实在STM32官网公众号有文章介绍了该问题,主要是先启动了串口再启动DMA就会容易引起该问题。因此为了防止该问题要不每次开DMA都清ORE寄存器;要不按规矩先开DMA再开串口,不用了先关串口再关DMA
|
|
|
|
|
|
配置的问题了
|
|
|
|
|
|
很简单的
|
|
|
|
|
youpukeji668 发表于 2019-1-11 06:31 正常方法是这样。 但是使用空闲中断也有一个问题,就是的发送端发送一帧数据不能被打断。不然stm32就会触发空闲中断,只接收到一帧的一部分数据。 空闲中断就是这个串口线有一个字节的时间没有数据传输就触发空闲中断吧。 那么假设我发送端要发送一帧数据,共20个字节,那么假设在发送到第10个字节的时候,被中断打断了,打断了之后恢复发送,那么打断到恢复发送这段时间超过了传输一个字节的时间,则就会触发接收端的空闲中断。 则接收端只接收到了10个字节,这个时候在中断里面关闭DMA再开启已经来不及接收后面的了? 这个问题怎么解决的阿? |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:51 , Processed in 1.070387 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1844