请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[UART] stm32h7使用串口空闲中断,DMA发送和接收冲突

[复制链接]

3

主题

15

回帖

24

积分

新手上路

积分
24
发表于 2023-5-20 13:48:50 | 显示全部楼层 |阅读模式
请教一下,我使用的主控芯片是STM32H7VBT6,在使用串口4的空闲中断时候,一旦使用串口的DMA发送函数,接收几帧正常的数据后,串口的接收就只能接收到一个字节了。(没有开启Cache)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-20 14:12:15 | 显示全部楼层
测试串口不使用DMA,也不使用中断,就纯发送,是否正常。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-20 14:39:30 | 显示全部楼层
eric2013 发表于 2023-5-20 14:12
测试串口不使用DMA,也不使用中断,就纯发送,是否正常。

硬汉大哥,刚才尝试了一下
1、关闭DMA,也不使用中断,就纯发送,发送的数据是正常的
2、开启DMA,但是使用HAL_UART_Transmit(&huart4,pData,Count,1000);普通的发送函数,同样在接收几帧正常的数据后  每次进入空闲中断就只能接收一个字节
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-20 15:02:07 | 显示全部楼层
我现在不用DMA 全改为普通的发送和接收方式 试一下
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-20 16:46:31 | 显示全部楼层
C:\Users\27428\Desktop\图片
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-21 08:26:55 | 显示全部楼层

图片没有上传成功。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-22 14:57:24 | 显示全部楼层
eric2013 发表于 2023-5-21 08:26
图片没有上传成功。

抱歉图片没有发送成功 我现在把问题总结一下,代码也上传上来
工程里使用预编译命令来切换用普通方式还是DMA方式

一、DMA方式串口收发问题
1、使用串口调试助手进行调试时候,单独进行串口的发送 或 串口的接收都是没问题的,能够一直跑 但是两者都用起来 串口接收几帧正常的数据后,接下来每次进入空闲中断,只显示接收1个数据,就是接收到上位机发的一帧数据的第一个字节

二、普通方式串口收发问题
1、开启了发送完成中断却没有进去
2、同样同时调用发送和接收函数 没过多久就不会再进入接收中断了

PS:发送函数是每20ms向上位机发送一包64字节数据,接收一般用上位机每1ms发送一包20字节数据
工程文件太大了 把串口的.c、.h上传到附件了

hal_usart.c

8.64 KB, 下载次数: 8

hal_usart.h

490 Bytes, 下载次数: 0

回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-22 15:10:48 | 显示全部楼层
链接:https://pan.baidu.com/s/1VTWTitheSTCmuVwLGmLddw
提取码:zfgz

我把完整工程上传到网盘了
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-22 15:13:43 | 显示全部楼层
第一次使用H7系列和hal库进行开发 没想到在串口这里的问题卡这么久
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-22 15:56:02 | 显示全部楼层
eric2013 发表于 2023-5-20 14:12
测试串口不使用DMA,也不使用中断,就纯发送,是否正常。

不使用DMA的情况下 我把hal库的发送和中断接收函数里面的 __HAL_LOCK(huart); 锁串口的函数注释掉了。现在发送就不会把接收干掉了,但是DMA+空闲中断的方式发送和接收冲突仍存在
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-22 15:58:03 | 显示全部楼层
Alex_Alex 发表于 2023-5-22 15:56
不使用DMA的情况下 我把hal库的发送和中断接收函数里面的 __HAL_LOCK(huart); 锁串口的函数注释掉了。现 ...

好的,今天稍晚些时候我看下你的工程
回复

使用道具 举报

330

主题

2022

回帖

3017

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3017
发表于 2023-5-22 16:52:02 | 显示全部楼层
本帖最后由 caicaptain2 于 2023-5-22 16:53 编辑
Alex_Alex 发表于 2023-5-22 14:57
抱歉图片没有发送成功 我现在把问题总结一下,代码也上传上来
工程里使用预编译命令来切换用普通方式还 ...

“1ms发送一包20字节数据”  这个要算算时间够不够?
你设定的是115200波特率,满打满算,1ms只能发送14个字节而已。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-22 17:01:42 | 显示全部楼层
caicaptain2 发表于 2023-5-22 16:52
“1ms发送一包20字节数据”  这个要算算时间够不够?
你设定的是115200波特率,满打满算,1ms只能发送14 ...

哦 这个确实 忘了考虑了  不过我在测试过程中 把发送间隔调到50ms、100ms,把串口波特率调到3M  也还会出现上述的问题
回复

使用道具 举报

3

主题

158

回帖

167

积分

初级会员

积分
167
发表于 2023-5-22 17:35:31 | 显示全部楼层
使用HAL写代码,就不要保留用标准库的习惯了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-23 07:30:48 | 显示全部楼层
最关键的一个地方要修改下,地址0x2000 0000S是DTCM,这个空间不支持通用DMA。也就是你的串口DMA。

将下面的对勾去掉。

下载.png


回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2023-5-23 09:21:35 | 显示全部楼层
Alex_Alex 发表于 2023-5-22 15:10
链接:https://pan.baidu.com/s/1VTWTitheSTCmuVwLGmLddw
提取码:zfgz

你这代码混装的啊,我都是只重写callback其他不动,你这破坏的HAL库结构,已经面目全非

https://www.armbbs.cn/forum.php?mod=viewthread&tid=108553&extra=

最新的HAL库已经给你写好了串口空闲中断的开启和接收的callback了:HAL_UARTEx_RxEventCallback

为了HAL_LOCK的影响,可以把DMA开启接收放while(1)里面处理,如果串口数据量多,要在串口里面开启

那么发送函数里面应该加上DMA是否发送完成,以及关闭相应的串口中断
[C] 纯文本查看 复制代码
/**
 * @brief 串口DMA模式发送函数 pData会copy到pTxBuf
 * 
 * @param phuartx 串口句柄
 * @param pData 发送数据的缓存地址
 * @param Size 发送数据的大小
 */
void BSP_UART_Transmit_DMA(BspUart_t *phuartx,  uint8_t *pData, uint16_t Size)
{
    while(phuartx->txStat == UART_TX_STATE_BUSY)
    {
        
    }
    phuartx->txStat = UART_TX_STATE_BUSY;
    memcpy(phuartx->pTxBuf, pData, Size);

    IRQn_Type eIRQn = (IRQn_Type)__UART_IRQ(phuartx->huart);
    HAL_NVIC_DisableIRQ(eIRQn);
    HAL_UART_Transmit_DMA(phuartx->huart, phuartx->pTxBuf, Size);
    HAL_NVIC_EnableIRQ(eIRQn);
}


[C] 纯文本查看 复制代码
/**
 * @brief 串口发送完成中断回调函数
 * 
 * @param huart 
 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    BspUart_t *phuartx = UART_GetHandlePtr(huart);
        
    phuartx->txStat = UART_TX_STATE_IDLE;
}


[C] 纯文本查看 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    BspUart_t *phuartx = UART_GetHandlePtr(huart);
    if((phuartx->rxCache == UART_CACHE_FIFO) && (phuartx->rxMqSize == 1))
    {
        osMessageQueuePut(phuartx->rxMqId, &phuartx->pRxBuf[1], 0U, 0U);
    }
    BSP_UART_ReceiveMode(phuartx, phuartx->rxMode);
    phuartx->rxFlag = 2;
}

回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-23 17:52:08 | 显示全部楼层
旮旯旭 发表于 2023-5-23 09:21
你这代码混装的啊,我都是只重写callback其他不动,你这破坏的HAL库结构,已经面目全非

https://www.a ...

嗯嗯 看了你的代码 确实保留了使用标准库的习惯  导致了一些奇奇怪怪的bug 后面我改成HAL库的结构
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2023-5-27 12:44:43 | 显示全部楼层
请问怎么把图片贴上来 我点图片 它让我输入地址 然后我把图片的本地目录贴上来了 没上传成功
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 02:34 , Processed in 0.383945 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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