请问HAL_UART_Receive_DMA能在中断处理函数里使用吗?

2019-07-18 17:24发布

HAL_UART_Receive_DMA能在中断处理函数里使用吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
ggfvxv
2019-07-19 13:30
今天试了F769的开发板,一样usart DMA接收只能接收固定长度。
我的程序代码,哪位帮忙看看,谢谢!
有的时候要发送两次甚至更多次才能接收,第一次多的NDRT数值为0,串口调试助手再发送一次,才能接收到.
/*
* uart1 dma rx idle intrrupt process
*/
void Addedto_USART1_IRQHandler(void)
{
        if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET) //uart1 dma rx idle intrrupt
        {
                static  uint32_t rxdatanum,temp;
        
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);        //clear uart1 dma rx idle intrrupt flag
                temp =huart1.Instance->SR;
                temp =huart1.Instance->DR;
                temp=huart1.hdmarx->Instance->NDTR;
//                CLEAR_BIT(huart1.Instance->CR3, USART_CR3_DMAR);
//                HAL_DMA_Abort(huart1.hdmarx);
                __HAL_DMA_DISABLE(huart1.hdmarx);
                rxdatanum=UART_DMA_RX_SIZE-(__HAL_DMA_GET_COUNTER(huart1.hdmarx));
               
                /* Enable the DMA transfer for the receiver request by setting the DMAR bit
    in the UART CR3 register */
    SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR);
                /* Enable the Peripheral */
    __HAL_DMA_ENABLE(huart1.hdmarx);
               
                osMessagePut(Queue_EventUart,(rxdatanum +((uint32_t )EVENT_UART1_RX<<16)),0);//send rx event
        }        
        
}

/**
* @brief This function handles USART1 global interrupt.
*/
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 */
        Addedto_USART1_IRQHandler();
  /* USER CODE END USART1_IRQn 1 */
}
为什么这样第一次无法正确接收,需要发两次甚至更多次才能收到上一次的数据?中断停在这个空闲中断处理函数里的sMessagePut函数,发现rxdatanum和temp值不正确,什么原因?

一周热门 更多>