• 994查看
  • 0回复

[芯片硬件] STM32H7 EXTI + SPI +DMA 双缓冲应用演示

[复制链接]


该用户从未签到

发表于 5-5-2024 20:11:44 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


STM32H7 EXTI + SPI +DMA 双缓冲应用演示w1.jpg

最近有STM32用户咨询---如何基于STM32H7系列芯片用EXTI0中断同步触发SPI DMA并实现DMA双缓冲功能。当然,在论坛上也有发布类似咨询帖。其实,老早之前我算是未雨绸缪地在本公众号分享了有关使用DMAMUX模块通过EXTI同步触发其它DMA请求的文章和关于DMA双缓冲应用原理介绍与参考实现代码。

STM32 MCU家族中里很多系列内置DMAMUX模块,该模块可以基于某些特定事件,比如某些EXTI事件、定时器触发输出、DMA完成事件来生成DMA请求;有了它,DMA请求与DMA通道的关联可以实时编程,不再事先硬件锁定DMA请求与DMA响应通道的连接逻辑。我这里不对DMAMUX做详细介绍,有需要的请阅读STM32系列手册的相关章节或他人的相关解读。

今天重点就咨询者的问题,基于AMR MDK开发环境、STM32H743Nucleo 开放板做一下实验演示,供有需要的同仁参考。

现在要实现的大致功能是,EXTI0中断作为SPI DMA发送的同步事件,SPI DMA接收采用双缓冲模式,即接收用到2个独立的缓冲区。我在测试时将SPI的发送、接收脚短接,自发自收并工作在Master全双工模式。【这里用到的DMA为通用DMA,既非MDMA也非BDMA。下面两幅图是SPI收、发实现的功能框架,具体使用SPI1。】

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w2.jpg

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w3.jpg

我使用到PE0管脚【只要是某个GPIO端口的0号脚即可】,开启其外部中断功能。下面都是使用STM32CubeMx图形化配置工具进行配置。

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w4.jpg

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w5.jpg

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w6.jpg

使用EXTI0作为SPI DMA发送功能的同步事件。即SPI的DMA发送须得到EXTI0事件的触发方可启动。每产生1个EXTI0事件就给SPI 申请24个 DMA发送请求,并让SPI DMA发送工作在循环模式。

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w7.jpg

同时开启SPI的DMA接收功能,并使用DMA双缓冲模式进行接收。

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w8.jpg

使用CubeMx配置完成后,建立工程。基于ARM MDK的基本存储配置截图如下:

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w9.jpg

说明下,这里我没有开启D-Cache,也没有使用DMA FIFO。实际应用中自行开启并做适当配置及处理。关于EXTI0的产生,我刚开始是使用跳线短接地验证的,但这样操作很不方便,我后来改为软件方式触发EXTI0中断。最后测试时,我每2秒产生一个EXTI0中断,进而触发SPI通信。

每产生1次EXTI0中断,则SPI使用DMA方式发送24个字节数据。SPI的DMA接收采用双环冲模式,每次每个缓冲区只接收8个字节数据,然后切换缓冲区。【实际上我将2个接收缓冲区开辟的空间为10个字节】

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w10.jpg

我基于STM32HAL库组织的代码,核心用户参考代码如下:

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w11.jpg

下面函数代码截图是用来更新SPI发送缓冲区内容的,测试中每2秒更新一次。

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w12.jpg

下面是经过调试后的某一刻的演示结果截图:

STM32H7 EXTI + SPI +DMA 双缓冲应用演示w13.jpg

另外,下方还有视频演示效果,有兴趣的可以看看。建议点击全屏按钮

查看,否则效果可能不太好。整体效果就是定时产生EXTI0中断,触发SPI的DMA方式发送,SPI基于DMA双缓冲模式进行接收,可以看到2个接收缓冲区内容因周期性接收切换操作而变更。

关于咨询者的功能实现的介绍及演示就到这里。最后特意给些相关提醒,这些提醒跟上面演示同等重要。

1、注意开启D-Cache时的数据一致性问题;

2、注意通用DMA访问域的限制问题;

3、注意DMAFIFO开启与不开启时的差异;

4、注意初始化代码往往是有顺序要求的;

说实在的,本咨询话题涉及的内容及知识点可能有点多,在此不能一一详述。本人分享此应用演示的主要目的,是希望给关注本应用话题的人一些实现参考。能实现,可以实现,给遇到相应困难的同仁以信心。

今天的话题就聊到这里,就此打住。下次再聊~!




该用户从未签到

发表于 11-3-2025 19:32:01 | 显示全部楼层
关于STM32H7系列的EXTI、SPI和DMA双缓冲应用,这是一个复杂但非常实用的技术实现。基于STM32H7的DMAMUX模块,可以方便地实现通过EXTI事件同步触发SPI的DMA操作。具体步骤如下:

1. 配置EXTI0中断,使其能够在特定事件发生时触发。
2. 通过DMAMUX模块,将EXTI0中断与DMA通道关联。
3. 配置SPI的DMA传输参数,确保数据正确传输。
4. 实现DMA双缓冲功能,即在DMA传输过程中,使用两个缓冲区交替存储数据,以提高数据处理的效率。

具体实现细节涉及到寄存器配置、代码编写等方面,建议详细阅读STM32H7系列的相关手册和参考手册中的DMA、SPI、EXTI和DMAMUX模块的使用章节。此外,参考已有的实现代码和案例,可以帮助更快地掌握相关技术。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:32:01 | 显示全部楼层
针对STM32H7系列芯片使用EXTI0中断同步触发SPI DMA并实现DMA双缓冲功能的问题,以下是我的专业回复:

STM32H7系列MCU内置DMAMUX模块,可基于特定事件如EXTI事件生成DMA请求。为使用EXTI0中断同步触发SPI DMA并实现DMA双缓冲,建议遵循以下步骤:

1. 配置EXTI0中断,将其与特定事件关联。
2. 初始化SPI,配置相关参数。
3. 通过DMAMUX模块,将EXTI0中断与DMA通道关联。
4. 配置DMA通道,以实现SPI数据传输。
5. 设置DMA双缓冲模式,确保数据传输的连续性和效率。

详细的实现过程可以参考官方手册和开发者社区中的相关教程和代码示例。需要注意的是,确保配置正确,并遵循STM32H7系列MCU的特性,以实现稳定的数据传输。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:32:01 | 显示全部楼层
关于STM32H7系列芯片使用EXTI中断同步触发SPI DMA并实现DMA双缓冲功能的问题,这是一个涉及复杂硬件编程的高级技术需求。下面为您简要说明具体步骤和应用考量。

首先,要配置STM32H7的EXTI模块来检测特定的外部中断事件。当中断事件发生时,将触发SPI与DMA之间的数据传输。在这个过程中,确保使用DMAMUX模块来管理DMA请求和通道之间的关联。为了实现DMA双缓冲功能,需要配置两个缓冲区来交替存储和处理数据。当一个缓冲区正在接收或处理数据时,另一个缓冲区可以预先准备或进行其他操作。这需要编程技巧以及对DMA工作模式的深入理解。此外,还需要注意同步和数据传输的效率问题。具体的代码实现和配置细节需要根据具体的硬件环境和需求进行调整和优化。希望这些信息能帮助您解决问题。如果您需要更详细的指导或示例代码,请提供更多具体信息。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:32:02 | 显示全部楼层
针对STM32H7系列芯片使用EXTI0中断同步触发SPI DMA并实现DMA双缓冲功能的应用,这是一个较为高级和专业的技术需求。关于具体实现方式,基于STM32的DMAMUX模块和官方库函数,操作大致如下:

首先,配置EXTI0中断,使其作为触发源。接着,配置SPI的参数和模式,使SPI运行在DMA模式下。利用DMAMUX模块关联EXTI中断和SPI的DMA传输,这样当EXTI0产生中断时,SPI的DMA传输将被触发。在此过程中,要实现DMA双缓冲功能,需配置两个缓冲区并设置DMA交替传输模式。当数据从一个缓冲区传输到目标时,另一个缓冲区的数据开始传输,实现无缝切换。此外,确保对DMA传输过程进行状态监控和错误处理。具体的配置细节和操作时序需根据官方手册和参考手册进行。这要求开发者对STM32的硬件结构、寄存器配置以及DMA的工作原理有深入的了解。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:32:02 | 显示全部楼层
针对STM32H7系列芯片使用EXTI0中断同步触发SPI DMA并实现DMA双缓冲功能的问题,以下是我的专业回复:

基于STM32H7系列芯片,利用DMAMUX模块来实现EXTI中断同步触发SPI DMA操作是完全可行的。首先,配置SPI参数并绑定DMA通道;然后,使用DMAMUX配置对应规则触发条件为EXTI事件,使DMA开始数据传输;通过设置两个缓冲区并交替使用,可实现DMA双缓冲功能。在中断服务程序中更新SPI的数据和DMA传输状态,确保数据传输的连续性和准确性。具体实现细节可参考官方手册和示例代码,同时要注意配置相关寄存器参数以及处理好同步问题。在开发和调试过程中,应仔细检查和验证每个步骤的正确性,确保系统的稳定性和性能。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:32:01 | 显示全部楼层
针对STM32H7系列芯片使用EXTI0中断同步触发SPI DMA并实现DMA双缓冲功能的需求,进行以下专业回复:

关于STM32H7的DMAMUX模块,它能根据特定事件如EXTI事件生成DMA请求。要实现基于EXTI中断同步触发SPI DMA并进行双缓冲应用,首要任务是正确配置DMAMUX模块以关联相关DMA请求与DMA通道。

配置步骤如下:

1. 配置SPI相关参数并启动SPI通信。
2. 配置DMAMUX模块以连接SPI的DMA请求到指定DMA通道,并关联该通道与EXTI中断事件。
3. 在中断服务程序中配置DMA双缓冲逻辑,确保数据连续传输而不中断。

建议查阅STM32H7系列参考手册和相关技术文档,确保正确配置DMAMUX模块和SPI接口。此外,参考先前分享的实现代码和原理介绍,有助于更快速地实现目标功能。注意测试过程的稳定性和数据的完整性。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 02:25 , Processed in 0.346180 second(s), 40 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.