硬汉嵌入式论坛

 找回密码
 立即注册
查看: 417|回复: 6
收起左侧

[STM32H7] 有没有基于 LL 库的串口 Demo

[复制链接]
回帖奖励 540 个金币 回复本帖可获得 20 个金币奖励! 每人限 1 次

22

主题

109

回帖

175

积分

初级会员

积分
175
发表于 2025-10-31 11:20:26 | 显示全部楼层 |阅读模式
本帖最后由 刘心武 于 2025-10-31 14:11 编辑

想搞一个接收超时(不是空闲中断)的串口接受逻辑,发现 HAL 中没有这个接口。

有没有基于 LL 库的工程,配置 DMA 的串口 Demo?
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
发表于 2025-10-31 14:52:24 | 显示全部楼层

回帖奖励 +20 个金币

HAL库接收超时的接口在它的error call back中,在error callback中判断超时标志位就行,不像IDLE有单独的callback
回复

使用道具 举报

22

主题

109

回帖

175

积分

初级会员

积分
175
 楼主| 发表于 2025-10-31 15:04:33 | 显示全部楼层
Devil_920 发表于 2025-10-31 14:52
HAL库接收超时的接口在它的error call back中,在error callback中判断超时标志位就行,不像IDLE有单独的ca ...

有没有相关 demo 想参考参考
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
发表于 2025-10-31 15:08:11 | 显示全部楼层
static int32_t serial_receiver_enable(Serial_Typedef *serial)
{
    UART_HandleTypeDef *handle = &serial->handle;
    __HAL_UART_CLEAR_IDLEFLAG(&serial->handle);
    __HAL_UART_CLEAR_OREFLAG(&serial->handle);

    __HAL_UART_ENABLE_IT(handle, UART_IT_ERR);
    __HAL_UART_ENABLE_IT(handle, UART_IT_ORE);

    if (handle->Instance != LPUART1)
    {
        HAL_UART_ReceiverTimeout_Config(handle, SERIAL_FRAME_TIMEOUT);
        HAL_UART_EnableReceiverTimeout(handle);
        __HAL_UART_ENABLE_IT(handle, UART_IT_RTO);
        return HAL_UART_Receive_DMA(handle, serial->pRxBuff, serial->pRxBuffSize);
    }
    else
    {
        __HAL_UART_ENABLE_IT(handle, UART_IT_IDLE);
        return HAL_UARTEx_ReceiveToIdle_DMA(handle, serial->pRxBuff, serial->pRxBuffSize);
    }
}

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    Serial_Typedef *serial = GET_STRUCT_ENTRY(huart, Serial_Typedef, handle);
    uint32_t error         = HAL_UART_GetError(huart);

    if (HAL_UART_ERROR_RTO & error)
    {
        __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF);
        HAL_UART_AbortReceive(huart);

        /* 数据入队 */
        serial_receive_to_ringbuffer(serial);
    }

    if (HAL_UART_ERROR_DMA & error)
    {
    }

    if (HAL_UART_ERROR_ORE & error)
    {
        __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
    }

    if (HAL_UART_ERROR_FE & error)
    {
        __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
    }

    if (HAL_UART_ERROR_NE & error)
    {
        __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
    }

    if (HAL_UART_ERROR_PE & error)
    {
        __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
    }

    memset(serial->pRxBuff, 0, serial->pRxBuffSize);

    if (huart->Instance != LPUART1)
    {
        HAL_UART_Receive_DMA(huart, serial->pRxBuff, serial->pRxBuffSize);
    }
    else
    {
        HAL_UARTEx_ReceiveToIdle_DMA(huart, serial->pRxBuff, serial->pRxBuffSize);
    }
}
关键代码就这两段,你自己看吧
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2025-10-31 15:25:01 | 显示全部楼层
回复

使用道具 举报

5

主题

235

回帖

255

积分

高级会员

积分
255
发表于 2025-10-31 15:39:58 | 显示全部楼层

回帖奖励 +20 个金币

关于这个问题:可以使用接收一个字节就进中断,接收到的数据仍FIFO,同时开启定时器(初始化时设置好超时时间),定时器选择单次脉冲功能,如果2个字节接收间隔大于定时器单次脉冲时间进入定时器的callback, 置标志位进主循环处理。
回复

使用道具 举报

6

主题

84

回帖

102

积分

初级会员

积分
102
发表于 2025-11-1 12:04:34 | 显示全部楼层

回帖奖励 +20 个金币

串口配合DMA和串口IDLE中断简直完美
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-12 07:27 , Processed in 0.046427 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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