你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
wangjinkui 提问时间:2017-10-30 22:24 /
本帖最后由 wangjinkui 于 2017-10-30 22:29 编辑

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



  1. void Usart2Receive_IDLE(UART_HandleTypeDef *huart)  
  2. {  
  3.      uint32_t temp;  
  4.      if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  
  5.           {   
  6.                       __HAL_UART_CLEAR_IDLEFLAG(huart);  
  7.                       HAL_UART_DMAStop(huart);  
  8.                      temp = __HAL_DMA_GET_COUNTER(huart->hdmarx);  
  9.                      Usart2Type.rx_len =  RECEIVELEN - temp;
  10.            if(Usart2Type.usartDMA_rxBuf[0] == 0x90&&Usart2Type.usartDMA_rxBuf[1] ==0xEB&&Usart2Type.usartDMA_rxBuf[4] ==0x45)
  11.                  {
  12.                       Eph_ready = 1;
  13.                      Eph_len = Usart2Type.rx_len;
  14.                      memcpy(Eph_buf,Usart2Type.usartDMA_rxBuf,Usart2Type.rx_len);                        
  15.                  }                                                        
  16.              }
  17.      }
复制代码

收藏 1 评论5 发布时间:2017-10-30 22:24

举报

5个回答
wangjinkui 回答时间:2017-10-30 22:28:45
需要接收超过1000个字节的数据,全速运行的时候可以收到5个字节,单步调试的时候可以全部接收到
wangjinkui 回答时间:2017-11-2 13:58:15
请问有工程师遇到这种情况吗?
wolfgang2015 回答时间:2017-12-6 09:40:05
用的 FreeRTOS来控制?对于串口这种收发资源,要判断状态信号量的。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-12-6 11:34:37
感觉是接收时,没有处理溢出,只接收了第一次的数据。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

eagle0754 回答时间:2017-12-7 08:38:05
为什么不把接收缓冲设成DMA环形,然后在任务里处理数据。我不知你接收数据的间隔多少?还有你在发送时关了接收。你可以试下只接收不发送是不是正常的

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版