STM32之USART2 DMA通信

本文介绍了STM32中的DMA(直接存储器访问)技术,包括其原理与优势,并详细展示了如何通过步骤创建一个DMA传输实例,从配置芯片型号、设置串口到使能中断等。同时分享了在实际编程过程中遇到的问题及其解决方案。


一直没有时间研究DMA,很高效的数据传输方式,今天终于有机会一窥全貌了。

一.DMA介绍

DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
在这里插入图片描述
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA框图
在这里插入图片描述

二、创建DMA例程

1.创建工程,选择芯片型号

在这里插入图片描述
芯片根据实际情况选择

2.设置RCC,选择Cystal(可选)

在这里插入图片描述

3.设置串口

1点击USATR1
2设置MODE为异步通信(Asynchronous)
3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
4GPIO引脚自动设置 USART1_RX/USART_TX
在这里插入图片描述

4.使能中断

在这里插入图片描述

5.DMA设置

点击DMASettings 下的 Add 添加通道,传输速率设置为中速
在这里插入图片描述

6.模式设置为Normal,右侧选择Memory

在这里插入图片描述

7.在System view下选择DMA

在这里插入图片描述

8.左侧点击ADD的添加

在这里插入图片描述

9.进行时钟设置

在这里插入图片描述

10.设置工程名和IDE的版本

在这里插入图片描述
点击右上角GENERATE CODE,完成

11.提示

上面的步骤由于芯片差异,不是每一步都要求一样,按照实际情况来。

三、代码改写及运行效果

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();

  uint8_t Senbuff[10] = {1,2,3,4,5,6,7,8,9,0};
  uint8_t Senbuff2[10] = {1,2,3,4,5,6,7,8,9,0}; 	
  uint16_t count = 0;

  while (1)
  {
		 count++;
		memset(Senbuff, 0, 10);
		memcpy(Senbuff, Senbuff2, 10);
		Senbuff[0] = count;
		HAL_Delay(5);
    /* USER CODE END WHILE */
		HAL_UART_Transmit_DMA(&huart2, (uint8_t *)Senbuff, sizeof(Senbuff));
		
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
	  HAL_Delay(100);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
		HAL_Delay(100);
  }
}

测试有两种情况

1.开机只打印一次
在这里插入图片描述

2.开机狂打日志
在这里插入图片描述
至于为什么还在研究中…

狂打日志原因查清

UASRT2要勾选中断,重新生成代码正常了。DMA确实比较好用
在这里插入图片描述

博客参考

1.主要参考STM32之DMA通信
2.STM32的中断控制与DMA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静思心远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值