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

2019-07-18 17:24发布

HAL_UART_Receive_DMA能在中断处理函数里使用吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
lizhongrui
1楼-- · 2019-07-18 19:50
应该是没问题的,别在串口中断里用就好
ggfvxv
2楼-- · 2019-07-18 21:40
谢谢,我本来想在接收空闲中断处理函数里使用它接收数据
lizhongrui
3楼-- · 2019-07-18 23:26
ggfvxv 发表于 2019-6-4 14:20
谢谢,我本来想在接收空闲中断处理函数里使用它接收数据

哦,DMA+配合空闲中断我没用过,但是很多人都这么用,在空闲中断里开关DMA接收应该是可以的
khsahdwu
4楼-- · 2019-07-19 02:18
 精彩回答 2  元偷偷看……
ggfvxv
5楼-- · 2019-07-19 07:57
今天调了一天,还没搞定,情况是有时候发一次收不到,得发两次甚至更多次才能收到,明天把代码贴出来,各位帮忙给看看。另外f7的串口dma接收例子,上面说明最多接收10个字节,没说必须接收10个字节,明天用f7的开发版验证一下,另外再看看f7的历程有没有开空闲中断
ggfvxv
6楼-- · 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值不正确,什么原因?

一周热门 更多>