DMA的循环和正常模式区别

HAL库 DMA stm

1.什么是DMA


从数据手册可以看到,DMA不是外设,是和cpu具有同等地位的,数据传输不需要经过cpu,即外设到存储器或者从存储器到存储器

2.发送数据,这里我一般用的串口发送
串口阻塞发送,代码比较简洁,方便直接使用
HAL_UART_Transmit(&huart2,&rx,sizeof(rx),10000);
如果使用dma发送的话HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx));
不同的区别在于,HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx))如果调用了话,会一直不断执行发送的内容。
举个例子吧:
在这里插入图片描述

如果串口接收到0x12的话,即使RX_Buf==0x16了,HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx))还是会不停进行
相同例子,如果没有使用循环模式,那么实际效果和HAL_UART_Transmit(&huart2,&rx,sizeof(rx),10000);差不太多。

3.接收模式

以下是主函数的代码

 while (1)
  {
//      if(RX_Buf[0] == 0X01)
//      {
//
//      }
      if(RX_Buf[0] == 0X16)
      {
          HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,RESET);
      }
      if(RX_Buf[0] == 0X12)
      {
          HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,SET);
          HAL_UART_Transmit(&huart2,&rx,sizeof(rx),10000);
      }

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

接收到一个,判断里的条件不成立了
在这里插入图片描述在这里插入图片描述
最后尽量还是把发送接收都放入串口中断中,这样方便管理。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

    if(huart -> Instance == USART2)
    {
        if(RX_Buf[0] == 0X16)
        {
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,RESET);
        }
        if(RX_Buf[0] == 0X12)
        {
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,SET);
            HAL_UART_Transmit_DMA(&huart2,&rx,sizeof(rx));
        }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值