STM32
直播中

久醉不醒

9年用户 1055经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

如何在cubeMX中调整DMA相关设置呢

如何在cubeMX中调整DMA相关设置呢?
STM32串口是如何使用DMA模式接收发送数据的?

回帖(1)

陈琳

2021-12-7 14:06:47
stm32串口使用DMA模式接收发送数据

在cubeMX中调整DMA相关设置
在DMA Setting里点击Add添加USART1_TX,Mode有两种模式,
一种是普通模式,使用一次发送语句就发一次;
另一种是循环模式,使用一次发送会一直发送。
这里发送我选择普通模式,接收选择循环模式。










省略之前串口相关设置,想了解的可以看我之前串口的相关文章
生成代码,
定义相关变量

#define RXBUFFERSIZE  256     //最大接收字节数
char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;                        //接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0;                //接收缓冲计数


在main函数中打开串口DMA循环接收


/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */


while循环中添加发送函数


HAL_Delay(1000);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"testn", 5);        


重写接收中断回调函数,功能是把收到的数据再发送出去


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */

        if(Uart1_Rx_Cnt >= 255)  //溢出判断
        {
                Uart1_Rx_Cnt = 0;
                memset(RxBuffer,0x00,sizeof(RxBuffer));
                HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);        
        
        }
        else
        {
                RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
       
                if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
                {
                        HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
                      while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
                        Uart1_Rx_Cnt = 0;
                        memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
                }
        }
       
        //HAL_UART_Receive_DMA(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
这里为什么不用HAL_UART_Transmit_DMA() 这个函数呢?
实际测试过程中发现在回调函数中使用DMA方式发送数据会有丢包现象,在main函数中使用是没有问题的,暂时没有找到解决办法。
这里主要测试了DMA接收数据是正常的,使用DMA串口收发的主要目的也是防止大量接收串口数据时产生大量中断,占用大量cpu时间,导致程序运行卡顿。
运行结果


举报

更多回帖

发帖
×
20
完善资料,
赚取积分