使用stm32cubeMX进行串口DMA收发

一、DMA的基本介绍

DMA,全称Direct Memory Access,即直接存储器访问。 DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 具体关于DMA的介绍请看参考博客内容;

二、使用cubeMX创建DMA

1)创建工程

首先打开stm32cubeMX,点击新建工程,选择好芯片,我这里选择的是stm32f103c8,选择好后双击打开即可; ①时钟设置 点击RCC,设置高速外部时钟HSE 选择外部时钟源; ②设置串口 点击 Connectivity选择USART1串口,将Mode设置为异步通信,可见波特率为115200Bit/s,数据长度为8Bits等参数,以及芯片上的GPIO端口也设置成了对应的形式; 接下来还需要对NVIC Settings设置中断,如下: ③DMA设置 首先点击DMA Settings,然后添加USART1_RX和USART1_TX两个通道,并将它们的传输速率设置为中速,模式设置为正常模式,地址指针递增设置为内存地址指针递增,且每次增加一个Byte(字节); 接下来点击左上角的System Core,点击DMA,再添加一个默认通道MENTOMEN,表示从内存到内存的传输方向; ④时钟源设置 点击Clock Configuration将时钟树的内核时钟配置为72MHZ; ⑤ 工程文件设置 点击Project Manager,在Project界面下填写工程名和存储路径,并将IDE设置为MDK-ARM; 然后在Code Generator界面下进行如下勾选,再点击"GENERATE CODE"导出工程文件即可;

2)公程完善

首先在keil中打开刚刚导出的工程,如下图所示: 首先,点击魔法棒,在Output界面下选择Create HEX File,然后点击“OK”即可; 接下来完善功能,在mian.c文件中如下所示添加代码: 首先,在 /*USER CODE BEGIN Init */ 和 /*USER CODE END Init */之间添加如下代码:

/* USER CODE BEGIN Init */
	uint8_t Senbuff[] = " hello windows!!!";  //定义数据发送数组
  /* USER CODE END Init */

然后在其中的while循环中添加以下代码:

while (1)
  {
    /* USER CODE END WHILE */
			HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	        HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

添加完成后编译没有错误;

三、代码烧录

1)电路连接

对于USB-TTL来说,USB-TTL身上有五个管脚,分别是5V电源管脚、3.3V电源管脚、TXD(数据传送)管脚、RXD(数据接收)管脚、GND管脚

主要连接方式为:

PA9—RXD PA10—TXD

3.3V电源管脚和GND管脚接到芯片上的对应位置即可,芯片上的GND接口也需要和面包板的负极相连接; 还有就是开发板的BOOT配置,将板子上的跳线帽进行以下设置,表示转化为系统存储器模式;

BOOT0——>1 BOOT1——>0

2)代码烧录

首先,打开烧录软件mcuisp,将USB-TTL串口接入电脑,点击搜索串口即可看到接入的USB串口,然后将传输速率设置115200bit/s; 接下来,找到刚刚在keil中生成的HEX文件,点击“读器件信息”,右侧状态栏里显示一切准备就绪后,就可以点击“开始编程”进行烧录了;

3)结果展示

烧录完成后打开串口调试助手,同样搜索我们的串口,然后把HEX文件添加进去如下图所示: 注意:在打开串口前,需要将stm32芯片的BOOT0和BOOT1都设为1

四、总结

使用串口DMA收发数据大大节省了CPU的资源,使数据能更快传输。

五、参考内容

https://blog..net/as480133937/article/details/104827639/

经验分享 程序员 微信小程序 职场和发展