你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32H7 EXTI + SPI +DMA 双缓冲应用经验分享

[复制链接]
STMCU小助手 发布时间:2023-8-21 13:44
微信图片_20230821134249.png
最近有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。】
微信图片_20230821134250_5.png

4 m+ i& |4 Q7 W' g+ H8 o3 K6 n
微信图片_20230821134250_4.png
9 m8 s2 ^$ k0 Z. F( ^
我使用到PE0管脚【只要是某个GPIO端口的0号脚即可】,开启其外部中断功能。下面都是使用STM32CubeMx图形化配置工具进行配置。
微信图片_20230821134250_3.png

( l( j6 I3 E0 R# }6 J8 K; \
微信图片_20230821134250_2.png
. w7 C2 b; {) [' B
微信图片_20230821134250_1.png

7 k+ [/ B2 T$ m% [$ c
1 U& E$ F7 K( Y  O6 h& W
使用EXTI0作为SPI DMA发送功能的同步事件。即SPI的DMA发送须得到EXTI0事件的触发方可启动。每产生1个EXTI0事件就给SPI 申请24个 DMA发送请求,并让SPI DMA发送工作在循环模式。

3 V' b* e; X( `* b1 K: v. h
微信图片_20230821134250.png

5 v; Z2 L& G( A, f7 }8 ?
同时开启SPI的DMA接收功能,并使用DMA双缓冲模式进行接收。
. H: s9 O4 m3 d# E2 r( q2 Q; x7 d3 X
微信图片_20230821134251_3.png

$ s" k' J8 ^$ }! U3 C4 w
使用CubeMx配置完成后,建立工程。基于ARM MDK的基本存储配置截图如下:

& n( m+ E- j( o. d- X% B  |
微信图片_20230821134251_2.png

6 R; U) ^0 g" {! X
说明下,这里我没有开启D-Cache,也没有使用DMA FIFO。实际应用中自行开启并做适当配置及处理。关于EXTI0的产生,我刚开始是使用跳线短接地验证的,但这样操作很不方便,我后来改为软件方式触发EXTI0中断。最后测试时,我每2秒产生一个EXTI0中断,进而触发SPI通信。
每产生1次EXTI0中断,则SPI使用DMA方式发送24个字节数据。SPI的DMA接收采用双环冲模式,每次每个缓冲区只接收8个字节数据,然后切换缓冲区。【实际上我将2个接收缓冲区开辟的空间为10个字节】

' L6 W4 o/ p$ w/ ~5 l7 Q5 c
微信图片_20230821134251_1.png

/ H, A4 _+ D) p3 K
我基于STM32HAL库组织的代码,核心用户参考代码如下:

2 g3 |. |0 h5 a" F1 ~3 n
微信图片_20230821134251.png

: Y, t. w- A* m- c4 [/ z. }% J
下面函数代码截图是用来更新SPI发送缓冲区内容的,测试中每2秒更新一次。
: U# m/ @3 U- b# d/ p: T1 }
微信图片_20230821134252_1.png
. a. d% {  _( Q/ R" z0 R; f: U
下面是经过调试后的某一刻的演示结果截图:
" c! t5 L9 v+ e3 x: e1 I, Q
微信图片_20230821134252.png

3 R0 b! ?, j1 d9 R3 h! I  _1 m
另外,下方还有视频演示效果,有兴趣的可以看看。建议点击全屏按钮 1.png 查看,否则效果可能不太好。整体效果就是定时产生EXTI0中断,触发SPI的DMA方式发送,SPI基于DMA双缓冲模式进行接收,可以看到2个接收缓冲区内容因周期性接收切换操作而变更。
关于咨询者的功能实现的介绍及演示就到这里。最后特意给些相关提醒,这些提醒跟上面演示同等重要。
1、注意开启D-Cache时的数据一致性问题;
2、注意通用DMA访问域的限制问题;
3、注意DMA FIFO开启与不开启时的差异;
4、注意初始化代码往往是有顺序要求的;
说实在的,本咨询话题涉及的内容及知识点可能有点多,在此不能一一详述。本人分享此应用演示的主要目的,是希望给关注本应用话题的人一些实现参考。能实现,可以实现,给遇到相应困难的同仁以信心。

" Z9 Q1 \$ J; p7 J0 M$ q- z8 }8 B
转载自: 茶话MCU
如有侵权请联系删除
- s* v8 H: x- I4 K, j
- M/ }3 c# u1 U1 T. E. w
赞 收藏 评论3 发布时间:2023-8-21 13:44

举报

3个回答
STMWoodData 回答时间:2023-8-29 09:03:23

学习学习

MrLeekon 回答时间:2023-8-29 10:39:52
学习一下
无敌小河马 回答时间:2023-8-29 14:13:32

学习了

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版