首页 程序笔记 STM32单片机DMA的FIFO传输应用示例

STM32单片机DMA的FIFO传输应用示例

前言

STM32系列芯片都内置DMA外设,其中很多系列的DMA配备了FIFO。这里以STM32F429芯片及开发板为例,演示一下带FIFO的DMA传输实现过程。
大致情况是这样的,我用TIMER1通道1的比较事件触发DMA,将内存数据写进UART5的数据发送寄存器DR,并将UART5的TX/RX脚物理短接,同时开启UART5的DMA接收模式,即DMA将UART5接收到的数据写到指定的接收内存区。下面重点介绍UART5的DMA方式的接收过程。

基本配置

首先使用STM32CubeMx完成基本配置。
下面是关于TIM1的相关配置,使用通道1的比较事件触发DMA,将内存数据写入UART的发送数据寄存器。为什么还要搞个定时器来触发,其中一个原因是为了后面好演示结果。

下面是关于UART5的基本配置,并开启其接收的DMA传输。此时配置还没有使用FIFO.

添加用户代码

代码基于STM32Cube库而准备,这里发送端发送17个字节数据出来。

/*USER CODE BEGIN PM */
#define Length(17)
uint8_t DataTosent [Length];
uint8_t DataReceived[Length];
/*USER CODE END PM */
//prepare data to be sent
for (uint8_t temp=0;tempLength;temp++)
  DataToSent [temp]=A+temp;
}
/* Enable the DMA stream at the request of CC1 event*/
HAL_DMA_Start_IT(htim1.hdma [TIM_DMA_ID_CC1],(uint32 t)DataTosent,
(uint32 t)huart5.Instance-DR,(uint32 t)Length);
//start UART5 RX by DMA
HAL_UART_Receive_DMA(huart5,DataReceived,Length);
/*Enable the TIM Capture/Compare 1 DMA request */
HAL_TIM_ENABLE_DMA (htim1,TIM_DMA_CC1);
//Start TIM1 with ch1 pwm output
HAL_TIM_PWM_Start(htim1,TIM_CHANNEL_1);
/*USER CODE END2*/

我们不妨先看看基于上面不使用FIFO的配置,即使用DMA 直接传输时的运行结果。

FIFO的结构

在演示基于FIFO的DMA应用结果之前,不妨简单介绍下FIFO的结构以及DMA传输过程中使用它有什么好处。
对于STM32F4来讲,每个DMA stream都有4个字的FIFO可用。它用来暂存来自DMA源端的数据,每当FIFO里存放的数据达到设定的阈值后,数据就会被移走。阈值可以设置为从1个字到4个字的深度。

启用DMA的FIFO可以最大程度地避免数据传输过程中的溢出问题,可以减少DMA对内存的访问次数从而减少总线访问竞争,通过BURST分组传输优化传输带宽以提升芯片性能。利用FIFO,通过对源端/目标端的数据进行打包或拆包以适应不同数据宽度的访问需求.让DMA的使用更为方便灵活.
这里以UART5的数据接收为例。当启用FIFO时,目的端数据宽度可以从字节/半字/字格式自由设置。首先,当UART5的DMA接收配置成下面这样时,即DMA single模式。

FIFO阈值设置为1/4满,即1个字的深度。运行上面代码,我们可看到来自源端的4个Byte被封装成1个word字。数据会按字方式逐一写入内存。【为看效果,我将定时器的触发放慢后做多次截图】

不过,按照上面方式将4个字节封装成一个字的传输过程中如果发生被打断的情况,此时就会遇到数据损坏的风险。因此就引入了DMA BURST传输,或称DMA节拍传输。即几个数据【4/8/16】被封装成1组,或称1个burst,或称1节。在一节内逐个进行数据传输,每个数据的传输相当于1拍。俨如音乐里的节拍,4拍1节、8拍1节之类的。对于每1节内的数据传输,DMA对总线的占用不会被总线矩阵仲裁器解除或打断,以保证每节数据的可靠完成。
我们还是以上面的应用为例,调整配置并开启BURST模式后具体看看。

我对memory端,也就是这里的目的端启用了BURST节拍传输。因为FIFO深度为1个字,每次源端数据刚好达到FIFO阈值水平时,通过1节4拍即可传输完毕,每拍对应1个byte的传输。基于BUSRT模式配置可以实现跟上面Single模式下同样的效果,而且数据传输更有保障。通过下图可以看出DMA按节进行传输,每节传输4个数据。

调整Burst配置

针对上述应用,我们还可以再次调整burst配置,比如下面的样子:

此时FIFO阈值为2个字,源端Memory的数据访问宽度为半字,Burst大小为4。这样的话,源端数据达到FIFO阈值时,4个半字数据组成1节分四拍传输完成,其中每拍传输半字数据。我们同样看看慢动作后的结果。

顺便提醒下,我们在做基于FIFO的burst模式的DMA传输时,BURST的大小乘以数据大小不得超过设置的FIFO阈值大小,否则会出错。比方以刚才上面的配置来看。

FIFO阈值为2个字,即8字节。数据宽度为半字,即2字节,Burst大小为4。完全合规
本文主要基于带FIFO的DMA传输的实现做了简单而比较直观的演示,顺便对DMA的burst传输做了些简单介绍,更多细节需阅读STM32参考手册相关内容。相信具体的实现示例配合技术手册阅读理解后再运用起来会更加得心应手。
======================

1、基于STM32多通道ADC综合应用示例

2、STM32G0系列ADC扫描序列模式解读

3、基于STM32CubeIDE的变量查看话题

4、单片机调试过程中的第3只眼

5、STM32 DMA双缓冲模式应用示例

原文链接(感谢原作者):https://blog.csdn.net/weixin_38106263/article/details/108787092

1

站心网

前言 STM32系列芯片都内置DMA外设,其中很多系列的DMA配备了FIFO。这里以STM32F429芯片及开发板为例,演示..

为您推荐

C#中的线程安全的集合ConcurrentQueue使用示例

在多线程编程中,如何安全地在不同线程之间共享数据是一个非常重要的问题。C# 为我们提供了一些专门设计的线程安全集合,其中之一就是 ConcurrentQueue<T>。它是一种先进先出(FIFO)的数据结构,专门为多线程环境设..

CSS砌体布局示例和使用场景

CSS砌体布局(Masonry Layout)CSS砌体布局是一种网页布局技术,它的灵感来源于砖石墙的排列方式,类似于“拼图”或“拼砖”的效果。在砌体布局中,元素的排列并不完全遵循传统的网格布局规则,..

SQL语句中的EXISTS用法示例

EXISTS 是 SQL 中用于判断子查询是否返回结果的关键字。它通常用于 WHERE 子句中,结合子查询一起使用。如果子查询返回至少一行数据,EXISTS 会返回 TRUE,否则返回 FALSE。EXISTS 用法示例假设有两个表:employees..

小米开源智能家居平台 ha_xiaomi_home 使用示例

小米近期在 GitHub 上开源了名为“ha_xiaomi_home”的项目,即 Home Assistant 米家集成组件。该组件由小米官方支持,旨在让用户在 Home Assistant 中集成和控制小米 IoT 智能设备。主要特点:官方支持:..

ASP.NET MVC最常用的设计模式代码示例

ASP.NET MVC 是一个基于分层架构的框架,其核心架构本身已经实现了 MVC 模式(Model-View-Controller)。除了 MVC 模式,开发者在使用 ASP.NET MVC 开发应用时,通常会结合其他设计模式以提高代码的可维护性、可扩展..

微软官方Microsoft.Extensions.AI库使用示例

Microsoft.Extensions.AI 库介绍Microsoft.Extensions.AI 是一个扩展库,用于在 .NET 应用程序中轻松集成人工智能(AI)服务,例如 OpenAI、Azure OpenAI 和其他支持文本生成或语言模型的 API。通过与 Microsoft.Ext..

如何优化ASP.NET Core应用的性能?

优化ASP.NET Core应用性能需要从代码、数据库、配置、服务器和部署等多个层面进行综合考虑。以下是一些优化ASP.NET Core应用性能的关键方法和技巧:1. 代码级优化使用异步编程:避免阻塞线程,通过async和await处理I..

在Docker、Kubernetes环境下部署.NET应用的最佳实践

在 Docker 和 Kubernetes 环境中部署 .NET 应用是现代云原生开发的重要实践之一。以下是一些经过验证的最佳实践,涵盖 Docker 镜像优化、Kubernetes 部署配置和整体架构建议。1. Docker 镜像构建的最佳实践1.1 使用..

.NET C# EntityFramework(EF)连接SQLite代码示例

在.NET C#中使用Entity Framework(EF)连接SQLite数据库是一种常见的做法,可以有效地管理和操作数据。以下是一个简单的示例代码,展示了如何使用EF Core连接到SQLite数据库并执行基本的CRUD操作。首先,确保你已经..

微软 .NET 9 正式发布!专为云原生和生成式 AI 应用设计

微软正式发布了 .NET 9,这是一次重大的版本更新。微软在 .NET 9 中带来了一系列新特性和改进,主要聚焦在性能优化、云原生支持、AI集成以及开发者体验的提升。以下是一些重要的更新亮点:性能改进:在 .NET 9 中,..

用Blazor开发App应用可行吗?

使用 Blazor 开发 App 应用是可行的,并且已成为跨平台应用开发的一种强大选择,特别适合在 Web、移动端(iOS、Android) 和 桌面端 上创建应用。Blazor 是一个支持使用 C# 和 .NET 的框架,开发者可以编写一套代码..

什么是.NET渐进式Web应用(PWA)

.NET 渐进式 Web 应用(PWA,Progressive Web Apps)是一种结合了 Web 应用的跨平台性和本地应用体验的应用程序。通过 PWA 技术,.NET 开发者可以使用 Blazor 和 WebAssembly 创建 Web 应用,支持在各种设备和操作系..

.NET 9 即将推出的功能Task.WhenEach

.NET 爱好者!我刚刚偶然发现了一个非常酷的新 PR,它被合并到 .NET 运行时存储库中,我想分享一个例子。希望您能为新的 .NET 版本大肆宣传!在即将到来的 .NET 9 版本中,我们预计会有一个名为 .它在这里让您的异步..

针对 Go 语言开发的 SQL 驱动模拟库

数据库交互是几乎所有应用程序不可或缺的一部分,开发者们常常需要对数据库进行各种操作,包括插入、更新、删除和查询等。然而,在开发过程中直接对真实数据库进行操作不仅耗时耗力,还可能带来数据一致性和安全性的..

DockerUI 中文可视化Docker管理工具使用示例

DockerUI 是由国内开发者打造的一款优秀的 Docker 可视化管理工具。该工具拥有简洁直观的UI界面,可以轻松进行Docker主机管理、集群管理,以及Docker任务的编排等操作。DockerUI不仅展示了资源利用率、系统信息和更..

Blazor的N种渲染模式原理和常见问题说明

我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..

前端CSS常见的三种设计模式

CSS设计模式主要包括OOCSS、SMACSS和BEMCSS等。以下是对这些模式的具体介绍:OOCSS:面向对象的CSS,旨在编写高可复用、低耦合和高扩展的CSS代码。它将抽象(结构)和实现(样式)分离,抽离公共代码,以提高代码的..

WinToUSB | 把Windows塞进U盘里即插即用

不论是在外出差,还是在家临时办公,现在很多设备携带起来都不是那么方便,在这种情况下,有一个轻巧而高效的操作系统环境就显得格外关键。今天,要给大家介绍一款超级实用的便携式系统启动盘,凭借其独特功能和卓越..

.NET Framework被淘汰了吗?

.NET Framework并未完全被淘汰,但它的某些版本确实已经停止支持。微软在2023年11月10日停止了对.NET Framework 4.8之前的版本的支持。这一决策意味着使用这些旧版本的应用程序将不再获得安全更新和其他维护,从而可..

强大的 .NET Mock 框架 单元测试模拟库Moq使用教程

单元测试是确保代码质量和可靠性的重要手段。当我们的代码依赖于外部系统、数据库或第三方服务时,编写有效的单元测试可能会变得复杂且耗时。为了简化这一过程,模拟(Mocking)技术应运而生。在 .NET 生态系统中,M..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制