硬汉嵌入式论坛

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

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

[复制链接]

6

主题

134

回帖

152

积分

初级会员

积分
152
发表于 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,把写了一半的内容给发送出去了

回复

使用道具 举报

19

主题

235

回帖

292

积分

高级会员

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

使用道具 举报

6

主题

134

回帖

152

积分

初级会员

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

14

主题

54

回帖

96

积分

初级会员

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 03:06 , Processed in 0.176045 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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