本帖最后由 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)
想问下,是我使用 HAL 的方式不对么
目前的处理方式是,自己写一个启动接收的函数
小尴尬:编写过程中,多次不小心按了 Ctrl+Enter,把写了一半的内容给发送出去了
|