F7采用HAL库DMA串口接收GPS数据,可以收大数据,但数据不完整

2019-07-20 05:43发布

目前可以收到GPS数据,但是收到的数据不完整,收到的数据顺序不对,这是怎么回事?
void uart5_init(u32 bound)
{
    //UART 3õê¼»ˉéèÖÃ
    UART5_Handler.Instance=UART5;                                            //UART5
    UART5_Handler.Init.BaudRate=bound;                                    //2¨ìØÂê
    UART5_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //×Ö3¤Îa8λêy¾Y¸ñê½
    UART5_Handler.Init.StopBits=UART_STOPBITS_1;            //ò»¸öí£Ö1λ
    UART5_Handler.Init.Parity=UART_PARITY_NONE;                    //ÎTÆæżD£Ñéλ
    UART5_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //ÎTó2¼tá÷¿Ø
    UART5_Handler.Init.Mode=UART_MODE_TX_RX;                    //êÕ·¢Ä£ê½
    HAL_UART_Init(&UART5_Handler);                                            //HAL_UART_Init()»áê1ÄüUART5
       
    HAL_UART_Receive_IT(&UART5_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//¸Ãoˉêy»á¿aÆô½óêÕÖD¶Ï£o±ê־λUART_IT_RXNE£¬2¢ÇòéèÖýóêÕ»o3åòÔ¼°½óêÕ»o3å½óêÕ×î′óêy¾Yá¿
    __HAL_LINKDMA(&UART5_Handler,hdmarx,uart5_rx_dma_handler);    //½«DMAóëUSART1áaÏμÆeà′(½óêÕDMA)

    uart5_rx_dma_handler.Instance = DMA1_Stream0;
    uart5_rx_dma_handler.Init.Channel = DMA_CHANNEL_4;
    uart5_rx_dma_handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
    uart5_rx_dma_handler.Init.PeriphInc = DMA_PINC_DISABLE;
    uart5_rx_dma_handler.Init.MemInc = DMA_MINC_ENABLE;
    uart5_rx_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    uart5_rx_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    uart5_rx_dma_handler.Init.Mode = DMA_CIRCULAR;
    uart5_rx_dma_handler.Init.Priority = DMA_PRIORITY_MEDIUM;
    uart5_rx_dma_handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        uart5_rx_dma_handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
        uart5_rx_dma_handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //′æ′¢Æ÷í»·¢μ¥′Î′«êä
        uart5_rx_dma_handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //íaéèí»·¢μ¥′Î′«êä

        HAL_DMA_DeInit(&uart5_rx_dma_handler);
    HAL_DMA_Init(&uart5_rx_dma_handler);
        HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
        __HAL_DMA_ENABLE(&uart5_rx_dma_handler);
    HAL_UART_Receive_DMA(&UART5_Handler,UART5_RX_BUF,UART5_MAX_RECV_LEN);      //Æô¶ˉ½óêÕ

}

//′®¿ú5ÖD¶Ï·tÎñ3ìDò
void UART5_IRQHandler(void)
{
    u16 res;
#if SYSTEM_SUPPORT_OS                 //ê1óÃOS
    OSIntEnter();
#endif
    if((__HAL_UART_GET_FLAG(&UART5_Handler,UART_FLAG_IDLE)!=RESET))
    {
               
                res = UART5->RDR;
                HAL_UART_IRQHandler(&UART5_Handler);
                __HAL_UART_CLEAR_IDLEFLAG(&UART5_Handler);
                __HAL_UART_CLEAR_IT(&UART5_Handler,UART_FLAG_IDLE);       
               
//        HAL_UART_DMAStop(&UART5_Handler);
        if(__HAL_DMA_GET_FLAG(&uart5_rx_dma_handler,DMA_FLAG_TCIF0_4))//μè′yDMA2_Steam7′«êäíê3é
                {
                        __HAL_DMA_CLEAR_FLAG(&uart5_rx_dma_handler,DMA_FLAG_TCIF0_4);//Çå3yDMA2_Steam7′«êäíê3é±êÖ¾
                        HAL_UART_DMAStop(&UART5_Handler);      //′«êäíê3éòÔoó1رÕ′®¿úDMA
                }       
        res=UART5_MAX_RECV_LEN-(__HAL_DMA_GET_COUNTER(&uart5_rx_dma_handler));
                printf("RX-count:%d ",res);
        HAL_UART_Receive_DMA(&UART5_Handler,UART5_RX_BUF,UART5_MAX_RECV_LEN);      //Æô¶ˉ½óêÕ
                UART5_RX_STA=1;
    }

    HAL_UART_IRQHandler(&UART5_Handler);
#if SYSTEM_SUPPORT_OS                 //ê1óÃOS
    OSIntExit();
#endif
}
#endif
//-------------------------------------------DMA1-------------------------------------------------------------------------------------------------------------------
void DMA1_Stream0_IRQHandler(void)
{
#if SYSTEM_SUPPORT_OS                 //ê1óÃOS
    OSIntEnter();
#endif

        HAL_DMA_IRQHandler(&uart5_rx_dma_handler);
        HAL_UART_DMAStop(&UART5_Handler);
    HAL_UART_Receive_DMA(&UART5_Handler,UART5_RX_BUF,UART5_MAX_RECV_LEN);      //Æô¶ˉ½óêÕ
       
#if SYSTEM_SUPPORT_OS                 //ê1óÃOS
    OSIntExit();
#endif
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。