硬汉嵌入式论坛

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

[技术讨论] HAL库使用DMA会自动使能传输完成中断和半传输中断

[复制链接]

8

主题

155

回帖

179

积分

初级会员

积分
179
发表于 2022-12-15 14:53:04 | 显示全部楼层 |阅读模式
本帖最后由 cjunrong 于 2022-12-15 21:04 编辑

STM32F4,HAL,版本:1.27.1
在使用DMA的时候,调用 HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
来启用DMA接收串口数据,在该函数中,会调用 HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
然而在该函数内部,会打开传输完成中断,半传输中断,以及直接模式错误中断:执行了:
[C] 纯文本查看 复制代码
/* Enable Common interrupts*/
hdma->Instance->CR  |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME;

if(hdma->XferHalfCpltCallback != NULL)
{
  hdma->Instance->CR  |= DMA_IT_HT;
}

这样有一个问题,就是当我接收到一半长度数据的时候就会进入一次中断,但这不是我的本意
特别是当我想配合串口的空闲中断来使用的时候,调用 HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
来启动接收传输,这时候很尴尬,就是当进入 DMA 中断的时候,会因为判断了 DMA_IT_TC 和 DMA_IT_TE 而重复两次调用了回调函数:void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

000.jpg

想问下,是我使用 HAL 的方式不对么
目前的处理方式是,自己写一个启动接收的函数

小尴尬:编写过程中,多次不小心按了 Ctrl+Enter,把写了一半的内容给发送出去了

回复

使用道具 举报

24

主题

365

回帖

437

积分

高级会员

积分
437
发表于 2022-12-15 15:59:34 | 显示全部楼层
void HAL_UART_RxCpltCallback (UART_HandleTypeDef * huart)
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

积分
179
 楼主| 发表于 2022-12-15 21:05:32 | 显示全部楼层
tovinz 发表于 2022-12-15 15:59
void HAL_UART_RxCpltCallback (UART_HandleTypeDef * huart)

这个和使用哪个回调函数没有关系吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2022-12-16 12:05:41 | 显示全部楼层
STM32的HAL库DMA配置都是这样的,之前做的H7系列就是这样,可以考虑这样关闭
image.png
回复

使用道具 举报

21

主题

81

回帖

144

积分

初级会员

积分
144
发表于 2023-1-7 09:59:42 | 显示全部楼层
确实有这问题,我一度怀疑是我自己的配置出了问题,直到我一路跳到hal库文件里面才发现了这问题。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-4-16 23:19:33 | 显示全部楼层
1、可以在中断回调里面查询接收事件,可以判断是半满,全满,空闲事件,等到空闲事件或者是全满事件再处理数据就好了。
2、是否有RxEvent查询函数可能跟HAL库版本有关系,见如下:

HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(const UART_HandleTypeDef *huart)
{
  /* Return Rx Event type value, as stored in UART handle */
  return (huart->RxEventType);
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 06:50 , Processed in 0.046491 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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