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

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
请问有工程师遇到这种情况吗?
wolfgang 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版