硬汉嵌入式论坛

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

[有问必答] STM32F407, HAL库,使用DMA串口发送时有小概率卡死在HAL_DMA_GetState

[复制链接]

11

主题

34

回帖

67

积分

初级会员

积分
67
发表于 2025-3-12 14:59:22 | 显示全部楼层 |阅读模式
简单说一下固件整体情况:F407,168M主频,跑的FreeRTOS,用到了6个串口,接收全部都是DMA空闲接收中断,发送除了COM3为DMA_TX(每2秒发送一次心跳,中间会穿插发送其他数据帧,有队列机制),其余都是中断方式进行发送
回复

使用道具 举报

11

主题

34

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2025-3-12 15:00:18 | 显示全部楼层
[C] 纯文本查看 复制代码
int printf_DMA(const char *format, ...)
{
    va_list arg;
    static char SendBuff[1024] = {0};
    int return_data;

    while(HAL_DMA_GetState(&hdma_usart3_tx) != HAL_DMA_STATE_READY);

    va_start(arg, format);
    return_data = vsnprintf((char*)SendBuff, sizeof(SendBuff) + 1, (char*)format, arg);
    va_end(arg);

    HAL_UART_Transmit_DMA(&huart3, (uint8_t *)SendBuff, return_data);
    return return_data;
}
   
回复

使用道具 举报

11

主题

34

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2025-3-12 15:02:30 | 显示全部楼层
楼上为DMA发送函数,COM3对应的DMA发送中断也是开启的状态,现在的问题是有极小概率会卡在“HAL_DMA_GetState(&hdma_usart3_tx)”这个地方,不知道有没有什么方法能够处理这种情况
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-3-12 15:06:06 | 显示全部楼层
chaqs3 发表于 2025-3-12 15:00
[mw_shl_code=c,true]int printf_DMA(const char *format, ...)
{
    va_list arg;

换个判断方法,在串口中断里面有个TxCplt发送完成回调,在这个里面做个标识,然后这个地方判断。
回复

使用道具 举报

11

主题

34

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2025-3-12 15:14:50 | 显示全部楼层
eric2013 发表于 2025-3-12 15:06
换个判断方法,在串口中断里面有个TxCplt发送完成回调,在这个里面做个标识,然后这个地方判断。

HAL_DMA_GetState 设置等待超时(如规定一定长度的systick),超时则重新初始化串口,这种方法也行吧?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-3-12 15:23:13 | 显示全部楼层
chaqs3 发表于 2025-3-12 15:14
HAL_DMA_GetState 设置等待超时(如规定一定长度的systick),超时则重新初始化串口,这种方法也行吧?

串口DMA有个这种问题,一定要等待串口TC发送完成才是真的完成了。


回复

使用道具 举报

11

主题

34

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2025-3-12 15:29:16 | 显示全部楼层
eric2013 发表于 2025-3-12 15:23
串口DMA有个这种问题,一定要等待串口TC发送完成才是真的完成了。

多谢回复!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 06:30 , Processed in 0.039339 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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