【STM32 CubeMX】串口编程DMA

本文介绍了如何在STM32嵌入式系统中使用DMA技术优化串口通信,包括配置DMA通道、发送与接收函数的使用,以提高CPU效率和数据传输速度。
摘要由CSDN通过智能技术生成


前言

在嵌入式系统中,串口通信是一项至关重要的功能,它允许单片机与外部设备进行数据交换,如传感器、显示器或其他设备。然而,在高速数据传输的场景下,传统的串口通信方式可能会使CPU过于繁忙,从而影响系统的性能。为了解决这一问题,STM32系列微控制器提供了DMA(直接内存访问)技术,可以在不占用CPU资源的情况下实现高速的数据传输。本文将介绍如何利用STM32 CubeMX配置串口通信并使用DMA进行数据传输。


一、DMA方式

1.1 DMA是什么

想象一下你在单片机中需要把一堆数据从一个地方搬到另一个地方,比如从内存搬到外设(比如串口或者存储器)。传统的方式是由CPU来亲自操持每一个数据的传输,就像你亲自搬运每一件家具一样。

而DMA就像是单片机中的一支专业的搬家队伍。你可以告诉这支队伍从哪里搬到哪里,然后它们就可以自动完成这个任务,而不需要CPU一直牵头指挥。这样,CPU就可以专注于处理其他的事务,而不用为每个数据传输都忙碌起来。

所以,单片机中的DMA就是一种让数据在不需要CPU持续参与的情况下,在内存和外设之间自动传输的技术,使得单片机能更高效地完成一些数据搬运的任务。简而言之,就是让单片机变得更聪明、更省力。

比如下面这个图,如果我们使用普通的发送RAM里面的buf,那么cpu就要一位一位的取buf,放到串口发送寄存器中,那么就非常耗费时间,那么这时DMA就出现了,他可以直接让cpu把RAM里面的buf放到DMA,然后DMA自动把buf放到发送寄存器里,放到寄存器这个过程cpu是不参与的
在这里插入图片描述
他不仅可以发送,还可以把接收的寄存器放到DMA中,然后放到RAM中

1.2 CubeMX配置DMA

在这里插入图片描述
打开我们的串口,选择DMA设置,然后添加一个DMA,其中的DMA Request就是你为了什么而使用DMA,比如为了发送,为了接收都可以设置。

模式的设置:
在这里插入图片描述
模式有两种,一种是Normal,一种是circular
Normal:比如要传输1000字节,传输完了就ok了,不传输了
circular:比如要传输1000字节,传输完了,他会从开头,再传输一次

注意:这里不能打勾在这里插入图片描述
Memory需要打勾

1.3 DMA方式函数使用

DMA的发送

我们可以使用下面这个函数进行发送:

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);

他的参数为串口对象,要发送的data,要发送的大小。
比如说,我们可以这样:

HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Hello DMA",sizeof("Hello DMA"));

那么我们可以在串口里看到打印的数据:
在这里插入图片描述
上面这个函数的中断如下:

__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

当DMA发送完一半时,调用第一个回调函数
当DMA发送完时,调用第二个回调函数

接收函数

我们可以使用下面这个函数进行接收:

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

他的参数为串口对象,要接收的buf,要接收的大小。

上面这个函数的中断如下:

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);

对于纯DMA接收是没有意义的,比如你和外设通信,你调用DMA的接收,你还要去指定你要接收多少字节,可是,每次接收的都是不一样的啊,大小根本指定不了,所以DMA接收要和下节课的IDLE中断一起才有意义


总结

通过本文的介绍,我们学习了如何在STM32 CubeMX中配置串口通信并使用DMA进行数据传输。首先,我们利用CubeMX配置了串口通信的基本参数,包括波特率、数据位数和停止位数等。然后,我们配置了DMA通道,将串口接收和发送的数据直接传输到内存,而不需要CPU的干预。这样一来,系统的CPU资源就可以得到释放,提高了系统的性能和效率。最后,我们可以根据具体的应用场景,编写相应的串口通信代码,实现数据的接收和发送功能。通过合理地利用DMA技术,我们可以在嵌入式系统中实现高效可靠的串口通信功能,为各种应用场景提供了更好的支持。

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32CubeMX 6.6.1是一款由STMicroelectronics开发的软件工具,用于配置和生成STM32微控制器的初始化代码。它提供了一个图形化界面,让开发者可以快速轻松地选择和配置STM32芯片的外设和功能。 通过STM32CubeMX,开发者可以选择他们所需的外设,如GPIO,串口,SPI,I2C等,并对它们进行必要的配置,如引脚分配、时钟配置、中断设置等。该工具还提供了一些功能和特性,如时钟树配置、电源管理、DMA配置等,以帮助开发者更有效地利用STM32芯片的资源和功能。 一旦配置完成,STM32CubeMX会自动生成一份初始化代码,其中包含了开发者所选择的外设和功能的配置信息。这样,开发者就可以将这些代码集成到他们的项目中,并以此为基础进行功能开发和应用程序编写。 STM32CubeMX还支持多种开发环境和编程语言,如IAR Embedded Workbench, Keil MDK, GCC等,使得开发者可以使用他们熟悉的工具和语言进行开发。 总之,STM32CubeMX 6.6.1是一款实用的软件工具,为STM32微控制器的配置和代码生成提供了便利和高效性。它有助于开发者快速入门并提高开发效率,在STM32项目的开发过程中起到了重要作用。 ### 回答2: STM32CubeMX6.6.1是ST公司推出的一款基于STM32微控制器的软件配置工具。它可以帮助开发者快速生成STM32系列微控制器的初始化代码,并提供了一个图形化界面进行相关的软硬件配置。 首先,STM32CubeMX6.6.1具有良好的兼容性,可以支持多种型号的STM32微控制器。它不仅可以在新项目中使用,而且可以方便地与已有的项目进行集成,节省了开发者的时间和精力。 其次,STM32CubeMX6.6.1提供了直观而强大的图形化界面,在项目初始化时,可以通过简单的拖拽和配置来生成相应的初始化代码。例如,可以设置GPIO引脚的用途、配置时钟和中断等,同时还支持各种通信协议和外设的配置。 此外,STM32CubeMX6.6.1还提供了一些实用工具,如时钟配置、引脚冲突检测等,帮助开发者解决常见的硬件配置问题。 另外,STM32CubeMX6.6.1还集成了STM32Cube软件包,其中包含了一系列的软件组件和中间件,例如HAL库、RTOS、USB库等。这些软件组件和中间件可以直接在STM32CubeMX中进行配置,方便开发者快速添加所需功能。 综上所述,STM32CubeMX6.6.1作为一款专业的软件配置工具,可以为开发者提供快速、便捷的STM32微控制器初始化代码生成和软硬件配置服务,极大地简化了嵌入式系统的开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

人才程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值