wangjinkui 发表于 2017-10-30 22:24:50

stm32f4 串口DMA,空闲中断接收数据,单步调试成功,全速运...

本帖最后由 wangjinkui 于 2017-10-30 22:29 编辑

    stm32F4 使用串口DMA,空闲中断接收不定长的数据,单步调试的时候没有问题,全速运行时就出错了,出错的原因是进入中断后只收到几个数据,我想是不是时序的问题,改不过来了,请问有没有了解这是什么情况的能不能给一下指导,谢谢。相关代码如下:
主函数:
HAL_UART_Transmit(&huart2,HG1134_stop,6, 0xFFFF);//
      //               HAL_UART_Transmit(&huart6,HG1134_stop,6, 0xFFFF);//
                  __HAL_UART_DISABLE_IT(&huart3, UART_IT_IDLE);    //
                        __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);    //
                        HAL_UART_Receive_DMA(&huart2, Usart2Type.usartDMA_rxBuf, RECEIVELEN);//
                  while(Eph_ready == 0)
                        {                           
                              HAL_UART_Transmit(&huart2,HG1134_stop,6, 0xFFFF);//
                              HAL_Delay(1);      
                        HAL_UART_Transmit(&huart2,HG1134_ephout,8, 0xFFFF);   //
                              HAL_UART_Transmit(&huart6,HG1134_ephout,8, 0xFFFF);   //
                              HAL_Delay(300);
                              huart2.hdmarx->State = HAL_DMA_STATE_READY;
      HAL_UART_Receive_DMA(&huart2,Usart2Type.usartDMA_rxBuf,RECEIVELEN);                                 
                        }
                        __HAL_UART_DISABLE_IT(&huart2, UART_IT_IDLE);    //
                        HAL_UART_DMAStop(&huart2);                     //
                  HAL_UART_Transmit(&huart3,HG1134_close,7, 0xFFFF);//
                        __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);   //
                              HAL_UART_Receive_DMA(&huart3, Usart3Type.usartDMA_rxBuf, RECEIVELEN);中断函数



void Usart2Receive_IDLE(UART_HandleTypeDef *huart)
{
   uint32_t temp;
   if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
          {   
                      __HAL_UART_CLEAR_IDLEFLAG(huart);
                      HAL_UART_DMAStop(huart);
                     temp = __HAL_DMA_GET_COUNTER(huart->hdmarx);
                     Usart2Type.rx_len =RECEIVELEN - temp;
         if(Usart2Type.usartDMA_rxBuf == 0x90&&Usart2Type.usartDMA_rxBuf ==0xEB&&Usart2Type.usartDMA_rxBuf ==0x45)
               {
                      Eph_ready = 1;
                     Eph_len = Usart2Type.rx_len;
                     memcpy(Eph_buf,Usart2Type.usartDMA_rxBuf,Usart2Type.rx_len);                        
               }                                                      
             }
   }

wangjinkui 发表于 2017-10-30 22:28:45

需要接收超过1000个字节的数据,全速运行的时候可以收到5个字节,单步调试的时候可以全部接收到

wangjinkui 发表于 2017-11-2 13:58:15

请问有工程师遇到这种情况吗?

wolfgang2015 发表于 2017-12-6 09:40:05

用的 FreeRTOS来控制?对于串口这种收发资源,要判断状态信号量的。

无薪税绵 发表于 2017-12-6 11:34:37

感觉是接收时,没有处理溢出,只接收了第一次的数据。

eagle0754 发表于 2017-12-7 08:38:05

:)为什么不把接收缓冲设成DMA环形,然后在任务里处理数据。我不知你接收数据的间隔多少?还有你在发送时关了接收。你可以试下只接收不发送是不是正常的
页: [1]
查看完整版本: stm32f4 串口DMA,空闲中断接收数据,单步调试成功,全速运...