[STM32H7] STM32H7串口DMA接收短时间内频繁收到大量数据串口会挂死,软重启没用只能断电重启才正...

[复制链接]
4035|22
 楼主| m16ak47 发表于 2024-4-29 10:31 | 显示全部楼层 |阅读模式
有大神调试STM32H7串口DMA接收时出现过“串口DMA接收短时间内频繁收到大量数据后,串口就“挂死”,软重启没用只能断电重启串口才正常”这个问题没?
我测试时发现一旦短时间内给串口灌入大量数据,这个串口收发就没反应了,即能接收数据也不会进中断了,感觉就是串口这个外设挂掉了,一时之间排查不出到底是软件问题还是硬件问题?

以下是UART接收DMA回调函数:


uint16_t uart1_count,uart2_count,uart3_count;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance==USART1)//如果是串口1
    {
        uart1_count= UART_RxBufSize - __HAL_DMA_GET_COUNTER(&UART1DMA_Rx);
        if(uart1_count != 0){
            UART1DMA_Rx.Lock = HAL_UNLOCKED;
            if(huart->pRxBuffPtr < UART_RecvBuf[1])
            {
                CFifoUint8_InBlock(&UART1_RXcircularBuf.cfifo,UART_RecvBuf[0],uart1_count);
                HAL_UART_Receive_DMA(&UART1_Handler,UART_RecvBuf[1],UART_RxBufSize);
            }else{
                CFifoUint8_InBlock(&UART1_RXcircularBuf.cfifo,UART_RecvBuf[1],uart1_count);
                HAL_UART_Receive_DMA(&UART1_Handler,UART_RecvBuf[0],UART_RxBufSize);
            }
            UART1DMA_Rx.Lock = HAL_LOCKED;
        }
    }else if(huart->Instance==USART2)//如果是串口2 - wifi
    {
        uart2_count= Wifi_UART_RxBufSize - __HAL_DMA_GET_COUNTER(&UART2DMA_Rx);
        if(uart2_count != 0){
            UART2DMA_Rx.Lock = HAL_UNLOCKED;
            if(huart->pRxBuffPtr < UART2Wifi_RecvBuf[1])
            {
                CFifoUint8_InBlock(&UART2WIFI_RXcircularBuf.cfifo,UART2Wifi_RecvBuf[0],uart2_count);
                HAL_UART_Receive_DMA(&UART2_Handler,UART2Wifi_RecvBuf[1],Wifi_UART_RxBufSize);
            }else{
                CFifoUint8_InBlock(&UART2WIFI_RXcircularBuf.cfifo,UART2Wifi_RecvBuf[1],uart2_count);
                HAL_UART_Receive_DMA(&UART2_Handler,UART2Wifi_RecvBuf[0],Wifi_UART_RxBufSize);
            }
            UART2DMA_Rx.Lock = HAL_LOCKED;
        }
    }else if(huart->Instance==USART3)//如果是串口3 - RS485
    {
        uart3_count= UART485_RxBufSize - __HAL_DMA_GET_COUNTER(&UART3DMA_Rx);
        if(uart3_count != 0){
            UART3DMA_Rx.Lock = HAL_UNLOCKED;
            if(huart->pRxBuffPtr < UARTRS485_RecvBuf[1])
            {
                CFifoUint8_InBlock(&UART3RS485_RXcircularBuf.cfifo,UARTRS485_RecvBuf[0],uart3_count);
                HAL_UART_Receive_DMA(&UART3_Handler,UARTRS485_RecvBuf[1],UART485_RxBufSize);
            }else{
                CFifoUint8_InBlock(&UART3RS485_RXcircularBuf.cfifo,UARTRS485_RecvBuf[1],uart3_count);
                HAL_UART_Receive_DMA(&UART3_Handler,UARTRS485_RecvBuf[0],UART485_RxBufSize);
            }
            UART3DMA_Rx.Lock = HAL_LOCKED;
        }
    }
}


碧云天书 发表于 2024-5-1 16:02 来自手机 | 显示全部楼层
量大就不要用HAL库,中断处理流程太长,很容易堵死。你可以尝试用LL库。
夜阑风雨 发表于 2024-6-19 11:57 | 显示全部楼层
在调试STM32H7系列微控制器的串口DMA接收时,如果遇到串口在短时间内频繁收到大量数据后“挂死”,并且软重启无效,只能通过断电重启才能恢复正常的情况,可能是由于DMA缓冲区溢出
淡漠安然 发表于 2024-6-19 11:59 | 显示全部楼层
DMA、串口和其他外设可能存在资源冲突,例如共享中断线或内存区域。检查并确保所有资源配置正确,避免冲突
光辉梦境 发表于 2024-6-19 14:00 | 显示全部楼层
如果DMA接收缓冲区设置得不够大,无法容纳短时间内接收的大量数据,可能会导致数据溢出,进而导致系统异常。确保DMA缓冲区足够大,并且有适当的溢出处理机制。
一秒落纱 发表于 2024-6-19 16:00 | 显示全部楼层
如果DMA传输完成中断处理程序(ISR)中存在错误或者执行时间过长,可能会导致系统无法及时响应其他中断,从而引起系统挂死。优化中断处理程序,确保其简洁高效。
淡漠安然 发表于 2024-6-19 18:00 | 显示全部楼层
DMA、串口和其他外设可能存在资源冲突,例如共享中断线或内存区域。检查并确保所有资源配置正确,避免冲突
远山寻你 发表于 2024-6-19 20:00 | 显示全部楼层
在处理DMA接收数据时,可能存在逻辑错误,例如死循环、内存泄漏等,这些错误可能会导致系统资源耗尽,从而引起系统挂死。仔细检查软件逻辑,确保没有错误。
暖了夏天蓝了海 发表于 2024-6-19 22:00 | 显示全部楼层
可能是硬件问题,如串口线路干扰、电源不稳定等。检查硬件连接和电源供应是否正常。
三生万物 发表于 2024-6-20 02:00 | 显示全部楼层
你可以尝试修改缓冲区,确保DMA接收缓冲区足够大,能够处理预期的数据量。
江河千里 发表于 2024-6-20 04:00 | 显示全部楼层
确保DMA传输完成中断处理程序简洁高效,避免长时间占用CPU。
别乱了阵脚 发表于 2024-6-20 12:00 | 显示全部楼层
可以优化器配置资源,DMA、串口和其他外设的资源配置正确,避免冲突。
冰春彩落下 发表于 2024-6-20 14:00 | 显示全部楼层
仔细审查处理DMA接收数据的软件逻辑,确保没有错误。
小小蚂蚁举千斤 发表于 2024-6-23 17:31 | 显示全部楼层
HAL库中断处理流程太长,可以LL库或者标准库开发
AdaMaYun 发表于 2024-6-24 23:02 | 显示全部楼层
一般情况下应该是程序问题
LOVEEVER 发表于 2024-6-25 19:44 | 显示全部楼层
肯定是有问题的,还是得排查一下
suncat0504 发表于 2024-6-29 19:46 | 显示全部楼层
中断处理太频繁,会不会导致再入?这个调试起来好像也很麻烦。
 楼主| m16ak47 发表于 2024-7-19 18:05 | 显示全部楼层
碧云天书 发表于 2024-5-1 16:02
量大就不要用HAL库,中断处理流程太长,很容易堵死。你可以尝试用LL库。

实测HAL库在大数据量像921600这种波特率时确实非常容易丢包
香水城 发表于 2024-7-21 16:00 | 显示全部楼层
重点检查下是否发生了溢出错误。

接收处理代码尽量精简些。
tpgf 发表于 2024-7-22 08:29 | 显示全部楼层
数据量比较大 是不是把单片机给冲死了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

92

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部