|
芯片:STM32L496 库:HAL库 问题描述:在使用HAL库时发现串口在进行DMA发送数据的同时接收DMA数据,有时候会出现串口ORE错误。 通过查阅手册和网上相关问题的资料,发现是DMA发送和接收的HAL库函数都会给DMA上锁(都会调用HAL_DMA_Start_IT 这里边会有__HAL_LOCK(hdma))。然后当出现ORE错误的时候这个锁就无法解开了,然后接收的数据会出现接收到0并且不再向接收数组后边插入值而是往前面插入值。 我发现当我在检测这个到这个错误手动将DMA的Lock和State恢复,就可以避免此问题,串口DMA恢复正常接收数据。 我这样做是对的嘛?为什么这里使用HAL库会给DMA上锁,这不就相当于全双工变为了半双工。 |
STM32F3系列SDADC外部触发 DMA运输的bug
STM32 增加 WiFi + 以太网的低成本方案
在RS485通信中如何有效避免误码,距离5米,速率115200
请问各位一下stm32L431rct6这款芯片,官方有没有停产?
STM32F103C8T6 上电后无法通过串口发出数据的问题?
Discover Endless Word Challenges With Wordle Unlimited Every Day
UART中IDLE 中断与 RTO 接收超时中断有什么区别
STM32L496ZG 通过串口驱动 SIM7022 NB-IoT 模组无法注册网络
求问诡异的问题,eth网口ping不通
I2C 错误代码含义
微信公众号
手机版
这里的LOCK是针对各个独立的DMA通道的,应该没有全双工变半工的说法。
加LOCK的目的主要防止发生对同一DMA 通道进行重复启动,或说对正在工作中的DMA进行再启动。
在出现ORE错误后,在相应事件或中断里应该对各种标志或状态位进行清零或回归无错、就绪的状态,以开启后续的传输。 这个环节按理是用户在相关回调函数里完成,你手动操作并没什么不合理的地方。
你有可能在DMA发送处理中调用了
HAL_UART_DMAStop;这个函数会把串口的发送DMA和接收DMA都关掉。。。。