OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1010|回复: 2

STM32H7串口DMA短时间接收大量数据,串口外设直接挂死,断电重启该串口才恢复。

[复制链接]

5

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-4-7
在线时间
5 小时
发表于 2024-4-29 10:35:19 | 显示全部楼层 |阅读模式
1金钱
有大神调试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;
        }
    }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2011-5-11
在线时间
18 小时
发表于 2024-8-28 23:21:08 | 显示全部楼层
学习这件事情,不是缺乏时间,而是缺乏努力!
邮箱:lyg407@126.com
QQ: 516380635
淘宝店铺:xiaoqiang2008.taobao.com
回复

使用道具 举报

0

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2024-7-23
在线时间
27 小时
发表于 2024-8-29 18:07:13 | 显示全部楼层
学习这件事情,不是缺乏时间,而是缺乏努力!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 08:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表