OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6216|回复: 3

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

[复制链接]

9

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2017-8-30
在线时间
63 小时
发表于 2018-3-22 15:35:40 | 显示全部楼层 |阅读模式
10金钱
目前可以收到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\r\n",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
}

最佳答案

查看完整内容[请看2#楼]

慢慢调代码。 建议先不要用dma,看完整不。搞多了外设,一堆问题。一个个来。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-22 15:35:41 | 显示全部楼层
慢慢调代码。 建议先不要用dma,看完整不。搞多了外设,一堆问题。一个个来。
回复

使用道具 举报

9

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2017-8-30
在线时间
63 小时
 楼主| 发表于 2018-3-27 11:14:08 | 显示全部楼层
正点原子 发表于 2018-3-23 01:55
慢慢调代码。 建议先不要用dma,看完整不。搞多了外设,一堆问题。一个个来。

已解决,是我的res变量没有赋初值
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-10-10
在线时间
3 小时
发表于 2018-10-15 15:59:36 | 显示全部楼层
楼主,您好,能否将源代码发我一份学习?谢谢。邮箱:wangzi10060@163.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 21:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表