硬汉嵌入式论坛

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

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

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

21

主题

96

回帖

159

积分

初级会员

积分
159
发表于 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
回复

使用道具 举报

21

主题

96

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 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);
    }
}
关键代码就这两段,你自己看吧
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

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

使用道具 举报

5

主题

231

回帖

251

积分

高级会员

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

回帖奖励 +20 个金币

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

使用道具 举报

5

主题

75

回帖

90

积分

初级会员

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

回帖奖励 +20 个金币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 04:11 , Processed in 0.041274 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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