最近在写串口DMA空闲中断接收的时候,发现一个问题。因为我使用了串口DMA发送和接收功能,发现在中断里将DMA停止以后,收发功能都会停止,为了解决停止收功能,不影响发送部分,解决办法如下:
首先我是需要在接收中断内关闭DMA,如下所示:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//Check whether the specified UART flag is set or not.
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//Clear the UART IDLE pending flag.(Otherwise it will continue to interrupt)
HAL_UART_DMAStop(&huart1); //此函数带来的影响
/*******************/
Uart_recv_len = RECV_BUFFER_SIZE - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));
Uart_recv_flag = 1;
__HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);
}
之后跳转HAL_UART_DMAStop()函数,发现函数内部主要由两部分组成: 停止发送DMA + 停止接收DMA;因此想要不互相影响,只需要把此函数停止接收DMA部分复制出来即可;
HAL库还是特别方便的;