基于STM32H7 EXTI+SPI+DMA双缓冲应用演示

最近有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。】
我使用到pe0管脚【只要是某个gpio端口的0号脚即可】,开启其外部中断功能。下面都是使用stm32cubemx图形化配置工具进行配置。
使用exti0作为spi dma发送功能的同步事件。即spi的dma发送须得到exti0事件的触发方可启动。每产生1个exti0事件就给spi 申请24个 dma发送请求,并让spi dma发送工作在循环模式。
同时开启spi的dma接收功能,并使用dma双缓冲模式进行接收。
使用cubemx配置完成后,建立工程。基于arm mdk的基本存储配置截图如下:
说明下,这里我没有开启d-cache,也没有使用dma fifo。实际应用中自行开启并做适当配置及处理。关于exti0的产生,我刚开始是使用跳线短接地验证的,但这样操作很不方便,我后来改为软件方式触发exti0中断。最后测试时,我每2秒产生一个exti0中断,进而触发spi通信。
每产生1次exti0中断,则spi使用dma方式发送24个字节数据。spi的dma接收采用双环冲模式,每次每个缓冲区只接收8个字节数据,然后切换缓冲区。【实际上我将2个接收缓冲区开辟的空间为10个字节】
我基于stm32hal库组织的代码,核心用户参考代码如下:
下面函数代码截图是用来更新spi发送缓冲区内容的,测试中每2秒更新一次。
下面是经过调试后的某一刻的演示结果截图:
另外,下方还有视频演示效果,有兴趣的可以看看。建议点击全屏按钮查看,否则效果可能不太好。整体效果就是定时产生exti0中断,触发spi的dma方式发送,spi基于dma双缓冲模式进行接收,可以看到2个接收缓冲区内容因周期性接收切换操作而变更。
关于咨询者的功能实现的介绍及演示就到这里。最后特意给些相关提醒,这些提醒跟上面演示同等重要。
1、注意开启d-cache时的数据一致性问题;
2、注意通用dma访问域的限制问题
3、注意dmafifo开启与不开启时的差别;
4、注意初始化代码往往是有顺序要求的;
说实在的,本咨询话题涉及的内容及知识点可能有点多,在此不能一一详述。本人分享此应用演示的主要目的,是希望给关注本应用话题的人一些实现参考。能实现,可以实现,给遇到相应困难的同仁以信心。
今天的话题就聊到这里,就此打住。下次再聊~!


荷兰工程师谈中国:可怕的是他们的态度
三星推出两款新型笔记本产品,搭载英特尔第10代Comet Lake芯片
施耐德电气位于上海的旗舰物流中心完成智慧物流中心的数字化改造
浅谈电源星状走线设计分析
带电纳米粒子能给癌细胞带来致命打击
基于STM32H7 EXTI+SPI+DMA双缓冲应用演示
如何降低放大器噪声?
王剑:新能源锂电池双料题材龙头股 后市看涨
!销售/收购 TDS210 TDS210 TDS220示波器
如何使用微控制器测量电容
51单片机六个常见问题解析
开关电源控制芯片TEA152x系列的特性特点及应用
浅谈无线模块的板载天线
AMD对嵌入式处理器的更新
随着人们生活品质的提高 洗碗机逐渐成为新的掘金点
荣耀V40保值换新战报公布 京东热搜榜第一首销秒罄
麻省理工学院教授开启理解阿尔茨海默病的全新时代,老年痴呆有望治愈
俄军运输机数量非常少远落后于美国,中国将要赶超俄军运输机
卫浴自动化线 超60台协作机器人在线
减速机信任破冰 伺服电机开始稳步发展