打印
[STM32F1]

STM32F103 DMA回传数据问题

[复制链接]
245|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jsh560|  楼主 | 2023-8-26 00:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


使用STM32 新建了一个DMA空闲中断收不定长度数据,能收到。 想把收到的数据传回收到的数据,但发现:
1,如图片1,if(recv_end_flag==1)   //判断标志位
                {  
    HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);                       
                        HAL_Delay(5);
                        rxlen=0;
                        recv_end_flag=0; //清除标志位
                        memset(rxbuffer1,0x00,sizeof(rxbuffer1)); //清空数组
                }
在HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);        后必须增加延时,如果延时5ms,则返回的数据与收到的数据不一致,
2,如果延时增长到30ms,则返回的数据正确。如图2,


3,但如果直接在: USART1_IRQHandler(void)中,直接调用回调函数,回调函数中 "HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);//将接收到的不定长数据发送到上位机" 这个后面没有延时,就能把 数据全部上传,  问题:为什么回调函数中,使用DMA回传数据可以不用延时?   
    void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */


if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) //判断idle标志被置位
        {
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
                HAL_UART_DMAStop(&huart1); //  停止DMA传输
                rxlen =  BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //总计数减去未传输的数据个数,得到已经接收的数据个数
                recv_end_flag=1;                                           //一帧数据接收完成标志
      USAR_UART_IDLECallback(&huart1,rxlen);          // 调用用户定义空闲中断回调函数
         }

       
  /* USER CODE END USART1_IRQn 1 */
}

void USAR_UART_IDLECallback(UART_HandleTypeDef *huart,uint8_t rxlen )  //回调函数
        {
        if(huart == &huart1)  //判断是否为串口1产生中断
        {         
         HAL_UART_Transmit_DMA(&huart1, rxbuffer1,rxlen);//将接收到的不定长数据发送到上位机
             rxlen = 0;//清除数据长度计数
                 HAL_UART_Receive_DMA(&huart1,rxbuffer1,BUFFER_SIZE);//重新打开DMA接收
        }
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

65

帖子

1

粉丝