ST意法半导体
直播中

h1654155275.5753

8年用户 1178经验值
私信 关注
[问答]

STM32U575串口接收+GPDMA波特率不匹配怎么解决?

我用CubeMX配置的串口+GPDMA接收,115200波特率正常能用, 然后如果波特率设置错误为9600,再改回来115200,接收就不能用了,调试好像时DMA出错了,然后启用HAL_UARTEx_ReceiveToIdle_DMA函数依然错误,有大神知道怎么解决吗

回帖(3)

宋玉红

2025-3-7 15:01:17
在错误处理中重新初始化串口,问题解决了,虽然我也不知道为什么。
memset(&huart2,0,sizeof(UART_HandleTypeDef) );MX_USART2_UART_Init();
举报

李红霞

2025-3-7 15:01:23
会不会是出现传输错误导致DMA请求的停止?
举报

久醉不醒

2025-3-10 16:32:14

在使用STM32U575的串口接收功能时,如果波特率不匹配导致DMA接收出现问题,可能是由于以下原因:




  1. DMA配置问题:当波特率不匹配时,接收到的数据可能会出现错误,导致DMA接收缓冲区中的数据不完整或错误,进而引发DMA错误。




  2. 串口状态未正确复位:在波特率不匹配的情况下,串口的状态寄存器可能会被置为错误状态(如溢出错误、帧错误等),这些错误状态需要手动清除,否则后续的接收操作可能会失败。




  3. DMA缓冲区未正确复位:在波特率不匹配后,DMA的接收缓冲区可能已经填充了错误的数据,如果没有正确复位或清除缓冲区,可能会导致后续接收失败。




解决方案




  1. 清除串口错误标志
    在波特率不匹配后,手动清除串口的错误标志。可以使用以下代码来清除错误标志:


    __HAL_UART_CLEAR_FLAG(&huart, UART_FLAG_ORE | UART_FLAG_FE | UART_FLAG_NE);

    其中,huart是你的UART句柄。




  2. 复位DMA
    在波特率不匹配后,停止并重新初始化DMA。可以使用以下代码来停止和重新启动DMA:


    HAL_DMA_Abort(&hdma_usart_rx);  // 停止DMA
    HAL_DMA_DeInit(&hdma_usart_rx); // 反初始化DMA
    HAL_DMA_Init(&hdma_usart_rx);   // 重新初始化DMA

    其中,hdma_usart_rx是你的DMA句柄。




  3. 重新启动UART接收
    在清除错误标志并复位DMA后,重新启动UART接收。可以使用以下代码来重新启动接收:


    HAL_UART_Receive_DMA(&huart, pData, Size);

    或者使用HAL_UARTEx_ReceiveToIdle_DMA函数:


    HAL_UARTEx_ReceiveToIdle_DMA(&huart, pData, Size);

    其中,pData是接收缓冲区的指针,Size是接收缓冲区的大小。




  4. 检查波特率设置
    确保在更改波特率后,串口的波特率寄存器已经正确更新。可以使用以下代码来重新配置波特率:


    huart.Init.BaudRate = 115200;
    HAL_UART_Init(&huart);



示例代码


以下是一个完整的示例代码,展示了如何解决波特率不匹配问题:


void UART_ResetAfterBaudRateMismatch(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_usart_rx, uint8_t *pData, uint16_t Size)
{
    // 清除串口错误标志
    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE | UART_FLAG_FE | UART_FLAG_NE);

    // 停止并重新初始化DMA
    HAL_DMA_Abort(hdma_usart_rx);
    HAL_DMA_DeInit(hdma_usart_rx);
    HAL_DMA_Init(hdma_usart_rx);

    // 重新启动UART接收
    HAL_UARTEx_ReceiveToIdle_DMA(huart, pData, Size);
}

void main(void)
{
    // 初始化代码...

    // 假设波特率被错误地设置为9600
    huart.Init.BaudRate = 9600;
    HAL_UART_Init(&huart);

    // 接收失败后,重新设置波特率为115200
    huart.Init.BaudRate = 115200;
    HAL_UART_Init(&huart);

    // 调用重置函数
    UART_ResetAfterBaudRateMismatch(&huart, &hdma_usart_rx, pData, Size);

    while (1)
    {
        // 主循环代码...
    }
}

总结


通过清除串口错误标志、复位DMA并重新启动UART接收,可以解决波特率不匹配导致的接收问题。确保在更改波特率后,串口和DMA的配置都已正确更新。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分