硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2532|回复: 3
收起左侧

[UART] 串口空闲中断配合DMA传输出现异常

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2021-7-31 12:01:54 | 显示全部楼层 |阅读模式
void bsp_485_IRQHandler(void)
{
        static uint8_t idle_time=0;
        uint8_t temp,rx_len,i;
        uint8_t choose_get=1;
        uint8_t choose_set=2;
        uint8_t uart_error[20];
        uint8_t ch=0;
        uint8_t uart_p;
//    if(uart_p<UART_BUFF_SIZE)
//    {
//        if(__HAL_UART_GET_FLAG( &Uart5_Handle,  UART_FLAG_RXNE ) != RESET)//__HAL_UART_GET_IT
//        {
////            HAL_UART_Receive(&Uart5_Handle, (uint8_t *)(&uart_buff[uart_p]),51 , 100);
//                                           HAL_UART_Receive(&Uart5_Handle, uart5_dma_1,51 , 1000);
//                                           __HAL_UART_CLEAR_FLAG(&Uart5_Handle,UART_FLAG_RXNE );
////                                        READ_REG(Uart5_Handle.Instance->RDR);
////                                          __HAL_UART_CLEAR_FLAG(&Uart5_Handle,UART_IT_RXNE);
////                                          u5_printf("%c",uart_buff[uart_p]);
////                                          printf("%c",uart_buff[uart_p]);
////            uart_p++;
//                                       
//        }
////                                 HAL_UART_IRQHandler(&Uart5_Handle);       
             
                                if(__HAL_UART_GET_FLAG(&Uart5_Handle,UART_FLAG_IDLE) != RESET)
                                {
//                                        uart_p=0;
//                                        READ_REG(Uart5_Handle.Instance->RDR);
//                                        HAL_UART_Receive(&Uart5_Handle, &ch,1 , 100);
//                                        HAL_UART_Receive(&Uart5_Handle, &ch,1 , 100);
                                         __HAL_UART_CLEAR_IDLEFLAG(&Uart5_Handle);  //清除标志位
          HAL_UART_DMAStop(&Uart5_Handle);                                       
                                        if(idle_time>0)
                                        {
//                                                HAL_UART_DMAStop(&Uart5_Handle);                     //先停止DMA,暂停接收   
//             temp  =  __HAL_DMA_GET_COUNTER(&DMA_Handle_uart5_rx);// 获取DMA未传输个数                     
//             rx_len =  70 - temp; //总数减去未传输个数,得到已接收数据的个数
                                                if(uart5_dma_1[3]==0xc1)//表示查询命令,收到该命令后让电机数组得到dma数组的数据
                                                {
                                                       
                                                        _u5_485_dma_get_or_set(uart5_dma_1,choose_get);
                                                }
//                                                memset(uart5_dma_1,0,rx_len);
                                                 for(i=0;i<60 ;i++)
                                                {
                                                        uart5_dma_1=0;
                                                }
                                                rx_len=0;
//                                                HAL_UART_Receive_DMA(&Uart5_Handle,uart5_dma_1,70);//打开DMA接收
//            HAL_UART_Receive_DMA(&Uart5_Handle,uart5_dma_1,70);//打开DMA接收
//                                        __HAL_UART_CLEAR_IDLEFLAG(&Uart5_Handle);
//                                        u5_printf("产生串口5空闲中断\n");
                                          
                                        }
                               
                                        idle_time=2;
                                        HAL_UART_Receive_DMA(&Uart5_Handle,uart5_dma_1,70);//打开DMA接收
                         


                                }
                               
                                if(__HAL_UART_GET_FLAG(&Uart5_Handle,UART_FLAG_ORE) != RESET)
                                {
//                                        HAL_UART_Receive(&Uart5_Handle, &ch,1 , 100);
                                        __HAL_UART_CLEAR_OREFLAG(&Uart5_Handle);
                                        READ_REG(Uart5_Handle.Instance->RDR);
//                                         HAL_UART_Receive_IT(&Uart5_Handle,uart_error,5);
//                                        HAL_UART_Receive(&Uart5_Handle, uint8_t *pData, uint16_t Size, uint32_t Timeout);
                                }
                               
//                                HAL_NVIC_DisableIRQ(_485_INT_IRQ);
//                                __HAL_UART_DISABLE_IT(&Uart5_Handle,UART_IT_RXNE);
//                                __HAL_UART_DISABLE_IT(&Uart5_Handle,UART_IT_IDLE);
//                   __HAL_UART_ENABLE_IT(&Uart5_Handle,UART_IT_IDLE);
                                HAL_NVIC_DisableIRQ(_485_INT_IRQ);
//                                __HAL_UART_DISABLE(&Uart5_Handle);
                               
                                       
//                                if(__HAL_UART_GET_IT( &Uart5_Handle, UART_IT_IDLE ) != RESET)
//        {
//                                         for(i=0;i<uart_p;i++)
//                                        {
//                                                printf("%c ",uart_buff);
//                                                u5_printf("%c",uart_buff);
//                                        }
//                                        uart_p=0;
//        }
                                 
//    }
//        else
//        {
//                clean_rebuff();      
//        }
//                                HAL_UART_IRQHandler(&Uart5_Handle);
}



用了串口5空闲中断配合DMA实现不定长传输,第一波数据没有问题,从第二波数据开始仿真结果显示接收数组接收的数据出现移位情况

第一波数据

第一波数据

第二波数据

第二波数据

第三波数据

第三波数据



回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-7-31 13:28:10 | 显示全部楼层
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1

这个是STM32V6开发板上的实现,
如果你用的是V7开发板,H7的HAL已经集成了IDLE了,不知道你底层驱动是不是有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2021-7-31 14:28:31 | 显示全部楼层
帮顶。
回复

使用道具 举报

8

主题

78

回帖

102

积分

初级会员

积分
102
发表于 2021-8-2 18:42:31 | 显示全部楼层
可以先看一下发送有没有问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 20:11 , Processed in 0.264391 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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