打印
[STM32H7]

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

[复制链接]
2001|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、串口和其他外设可能存在资源冲突,例如共享中断线或内存区域。检查并确保所有资源配置正确,避免冲突

使用特权

评论回复
5
光辉梦境| | 2024-6-19 14:00 | 只看该作者
如果DMA接收缓冲区设置得不够大,无法容纳短时间内接收的大量数据,可能会导致数据溢出,进而导致系统异常。确保DMA缓冲区足够大,并且有适当的溢出处理机制。

使用特权

评论回复
6
一秒落纱| | 2024-6-19 16:00 | 只看该作者
如果DMA传输完成中断处理程序(ISR)中存在错误或者执行时间过长,可能会导致系统无法及时响应其他中断,从而引起系统挂死。优化中断处理程序,确保其简洁高效。

使用特权

评论回复
7
淡漠安然| | 2024-6-19 18:00 | 只看该作者
DMA、串口和其他外设可能存在资源冲突,例如共享中断线或内存区域。检查并确保所有资源配置正确,避免冲突

使用特权

评论回复
8
远山寻你| | 2024-6-19 20:00 | 只看该作者
在处理DMA接收数据时,可能存在逻辑错误,例如死循环、内存泄漏等,这些错误可能会导致系统资源耗尽,从而引起系统挂死。仔细检查软件逻辑,确保没有错误。

使用特权

评论回复
9
暖了夏天蓝了海| | 2024-6-19 22:00 | 只看该作者
可能是硬件问题,如串口线路干扰、电源不稳定等。检查硬件连接和电源供应是否正常。

使用特权

评论回复
10
三生万物| | 2024-6-20 02:00 | 只看该作者
你可以尝试修改缓冲区,确保DMA接收缓冲区足够大,能够处理预期的数据量。

使用特权

评论回复
11
江河千里| | 2024-6-20 04:00 | 只看该作者
确保DMA传输完成中断处理程序简洁高效,避免长时间占用CPU。

使用特权

评论回复
12
别乱了阵脚| | 2024-6-20 12:00 | 只看该作者
可以优化器配置资源,DMA、串口和其他外设的资源配置正确,避免冲突。

使用特权

评论回复
13
冰春彩落下| | 2024-6-20 14:00 | 只看该作者
仔细审查处理DMA接收数据的软件逻辑,确保没有错误。

使用特权

评论回复
14
小小蚂蚁举千斤| | 2024-6-23 17:31 | 只看该作者
HAL库中断处理流程太长,可以LL库或者标准库开发

使用特权

评论回复
15
AdaMaYun| | 2024-6-24 23:02 | 只看该作者
一般情况下应该是程序问题

使用特权

评论回复
16
LOVEEVER| | 2024-6-25 19:44 | 只看该作者
肯定是有问题的,还是得排查一下

使用特权

评论回复
17
suncat0504| | 2024-6-29 19:46 | 只看该作者
中断处理太频繁,会不会导致再入?这个调试起来好像也很麻烦。

使用特权

评论回复
18
m16ak47|  楼主 | 2024-7-19 18:05 | 只看该作者
碧云天书 发表于 2024-5-1 16:02
量大就不要用HAL库,中断处理流程太长,很容易堵死。你可以尝试用LL库。

实测HAL库在大数据量像921600这种波特率时确实非常容易丢包

使用特权

评论回复
19
香水城| | 2024-7-21 16:00 | 只看该作者
重点检查下是否发生了溢出错误。

接收处理代码尽量精简些。

使用特权

评论回复
20
tpgf| | 2024-7-22 08:29 | 只看该作者
数据量比较大 是不是把单片机给冲死了啊

使用特权

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

本版积分规则

7

主题

87

帖子

1

粉丝