打印
[其他ST产品]

【STM32专题 UART-DMA 】

[复制链接]
335|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
环境搭建:
硬件平台:STM32H750XBH6
开发环境:STM32CubeMX V6.8.1+KEIL V5.28.0.0
STM32H750固件版本:package V1.11.0
仿真下载驱动:ST-Link
上一节使用了中断的方式实现了uart,这一节使用DMA方式实现

什么是DMA??
DMA(Direct Memory Access)是一个硬件功能,用于使外围设备能够直接与系统内存进行数据交换,而不需要CPU的直接干预。这种方法减少了CPU的负担,并提高了数据传输的效率,尤其是对于大数据块的移动或复制操作。

在STM32微控制器中,DMA主要与各种外围设备(如UART、SPI、ADC等)结合使用,以实现高效的数据传输。例如,您可以使用DMA直接将ADC转换的数据存储到内存数组中,或从内存数组中发送数据到UART,而不需要在每次数据传输时都中断CPU。

使用特权

评论回复
沙发
结合国际经验|  楼主 | 2023-9-30 23:36 | 只看该作者
STM32中DMA的主要特点:
数据传输的自动管理:一旦DMA传输被设置和启动,DMA控制器会自动管理整个数据传输过程,而不需要CPU的任何干预。
多个通道:STM32的DMA通常具有多个通道,每个通道可以与不同的外围设备关联。
不同的数据传输方向:DMA可以从外围设备到内存、从内存到外围设备或者从内存到内存之间移动数据。
中断功能:当DMA传输完成或发生错误时,可以配置DMA产生一个中断。这使得CPU可以知道传输的状态,并采取相应的操作。
循环模式:在某些应用中,可以设置DMA在完成传输后自动重新开始,这在音频流或PWM波形生成等应用中很有用。
灵活的配置:可以配置数据的大小(例如8位、16位或32位)、增量地址等。

使用特权

评论回复
板凳
结合国际经验|  楼主 | 2023-9-30 23:36 | 只看该作者
使用场景:
音频和视频流:例如,从ADC采集音频数据或将音频数据发送到DAC。
通信接口:例如,从UART接收数据或向SPI发送数据。
数据缓冲:例如,当从一个传感器快速采集数据时。
任何需要大量数据移动或复制的场景,其中CPU的直接 involvement 可能会成为瓶颈。

使用特权

评论回复
地板
结合国际经验|  楼主 | 2023-9-30 23:37 | 只看该作者
看一下手册中的介绍


使用特权

评论回复
5
结合国际经验|  楼主 | 2023-9-30 23:37 | 只看该作者

使用特权

评论回复
6
结合国际经验|  楼主 | 2023-9-30 23:37 | 只看该作者

使用特权

评论回复
7
结合国际经验|  楼主 | 2023-9-30 23:37 | 只看该作者
DMA的基本框图通常包括以下组件:

DMA控制器(DMA Controller):这是DMA操作的核心,它负责管理数据的传输而不需要CPU的干预。
数据通道(Channel):DMA控制器中的每一个数据传输路径称为一个通道。
源地址寄存器(Source Address Register):存储数据将从哪里开始传输的内存地址。
目标地址寄存器(Destination Address Register):存储数据将被传输到哪里的内存地址。

使用特权

评论回复
8
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
此外还有

计数器(Count Register):记录还有多少数据需要传输。
控制逻辑(Control Logic):这部分负责决定何时开始传输、何时停止,以及数据是如何被传输的。

使用特权

评论回复
9
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
当DMA传输开始时:

CPU首先设置DMA控制器,包括源地址、目标地址以及要传输的数据长度。
DMA控制器接管总线,开始数据传输。
当所有数据都已传输或达到设定的计数器值时,DMA控制器生成一个中断,通知CPU数据传输已完成。

使用特权

评论回复
10
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
Cubemx配置DMA

第一种可以直接在DMA进行配置

使用特权

评论回复
11
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
第二种通过所在外设配置

使用特权

评论回复
12
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
使用UART(Universal Asynchronous Receiver-Transmitter)与DMA(Direct Memory Access)结合进行数据传输时,你可以选择是否启用UART的中断。

使用特权

评论回复
13
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
以下是两种常见的应用场景:

仅使用DMA,不使用UART中断:
当DMA传输完成后,DMA会产生一个中断(这是DMA自己的中断,与UART的中断不同)。
你可以在DMA的中断服务程序中处理数据或执行相关操作。
在这种场景下,UART的中断不是必需的,因为DMA已经处理了大部分的数据传输工作。

使用特权

评论回复
14
结合国际经验|  楼主 | 2023-9-30 23:38 | 只看该作者
同时使用DMA和UART中断:
除了DMA完成中断外,你可能还想知道其他UART相关的事件,例如错误条件(如帧错误、奇偶校验错误等)。
在这种情况下,你可以同时启用UART的中断以处理这些特殊的事件。
这样,即使DMA负责主要的数据传输工作,UART的中断仍然可以为你提供关于UART状态的额外信息。

使用特权

评论回复
15
结合国际经验|  楼主 | 2023-9-30 23:39 | 只看该作者
所以,决定是否开启UART的中断取决于你的具体应用需求。如果你只关心数据的传输,并依赖DMA来通知你何时完成,那么你可能不需要开启UART的中断。但是,如果你想获取更多的UART相关的状态或错误信息,那么启用UART的中断可能会很有用。

使用特权

评论回复
16
结合国际经验|  楼主 | 2023-9-30 23:39 | 只看该作者
这里我们开启usart的中断吧,上一个实验使用到了,这里依然开启,不然使用中断的就用不了了

使用特权

评论回复
17
结合国际经验|  楼主 | 2023-9-30 23:39 | 只看该作者

使用特权

评论回复
18
结合国际经验|  楼主 | 2023-9-30 23:39 | 只看该作者

使用特权

评论回复
19
结合国际经验|  楼主 | 2023-9-30 23:39 | 只看该作者
DMA两种模式
Normal 模式:
在这种模式下,当DMA传输所需的数据字节数完成后,传输会自动停止。
这意味着,如果你设置DMA传输100个字节,那么在这100个字节被传输后,DMA会停止,并可能产生一个中断(如果你已经使能了DMA完成中断)。
为了再次进行传输,你需要重新设置和启动DMA。

使用特权

评论回复
20
结合国际经验|  楼主 | 2023-9-30 23:39 | 只看该作者
Circular 模式:
在这种模式下,当DMA传输所需的数据字节数完成后,DMA不会停止,而是回到开始的位置,并继续传输。
使用前面的例子,如果你设置DMA在circular模式下传输100个字节,那么在这100个字节被传输后,DMA会再次从头开始传输相同的数据块,如此循环。
这种模式在需要持续不断的数据传输,如音频流、传感器数据读取等场景下非常有用。
即使是在circular模式下,DMA仍然可以在每次完成数据块传输后产生中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

692

帖子

1

粉丝