0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

茶话MCU 来源:茶话MCU 2023-08-21 09:12 次阅读

最近有STM32用户咨询---如何基于STM32H7系列芯片用EXTI0中断同步触发SPI DMA并实现DMA双缓冲功能。当然,在william hill官网 上也有发布类似咨询帖。其实,老早之前我算是未雨绸缪地在本公众号分享了有关使用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。】

f2492480-3e8c-11ee-ac96-dac502259ad0.png

f26a5aec-3e8c-11ee-ac96-dac502259ad0.png

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

f282afa2-3e8c-11ee-ac96-dac502259ad0.png

f2aae530-3e8c-11ee-ac96-dac502259ad0.png

f2e22aa4-3e8c-11ee-ac96-dac502259ad0.png

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

f2fc18a6-3e8c-11ee-ac96-dac502259ad0.png

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

f3238a30-3e8c-11ee-ac96-dac502259ad0.png

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

f34bf830-3e8c-11ee-ac96-dac502259ad0.png

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

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

f38e735e-3e8c-11ee-ac96-dac502259ad0.png

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

f3a83ec4-3e8c-11ee-ac96-dac502259ad0.png

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

f3c771a4-3e8c-11ee-ac96-dac502259ad0.png

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

f3e88a88-3e8c-11ee-ac96-dac502259ad0.png

另外,下方还有视频演示效果,有兴趣的可以看看。建议点击全屏按钮f435017e-3e8c-11ee-ac96-dac502259ad0.png查看,否则效果可能不太好。整体效果就是定时产生EXTI0中断,触发SPI的DMA方式发送,SPI基于DMA双缓冲模式进行接收,可以看到2个接收缓冲区内容因周期性接收切换操作而变更。

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

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

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

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

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

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

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

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17143

    浏览量

    351138
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91560
  • 定时器
    +关注

    关注

    23

    文章

    3248

    浏览量

    114775
  • dma
    dma
    +关注

    关注

    3

    文章

    561

    浏览量

    100572
  • stm32h7
    +关注

    关注

    0

    文章

    37

    浏览量

    1753

原文标题:STM32H7 EXTI + SPI +DMA 双缓冲应用演示

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用STM32H7EXTI0同步触发SPI DMA缓冲

    请教:有没有朋友用STM32H7EXTI0同步触发SPI DMA缓冲的,指教一下
    发表于 03-14 08:22

    STM32H7技术详解

    STM32H7 系统架构 • 单核及STM32H7系统框图 • AXI 总线及互联 • ART 加速器 • STM32H7 存储器 结构 • S
    发表于 09-07 06:01

    STM32H7演示:意法半导体

    意法半导体-STM32H7演示
    的头像 发表于 07-02 11:13 6493次阅读

    基于STM32介绍DMA缓冲模式

    目前STM32家族中有些系列支持DMA缓冲模式,比如STM32F2/STM32F4/
    的头像 发表于 02-02 16:47 2.4w次阅读
    基于<b class='flag-5'>STM32</b>介绍<b class='flag-5'>DMA</b>的<b class='flag-5'>双</b><b class='flag-5'>缓冲</b>模式

    STM32H7正式投入生产 样品现已上市

    STM32H7正式投入生产,样品现已上市
    的头像 发表于 03-01 12:04 3730次阅读
    <b class='flag-5'>双</b>核<b class='flag-5'>STM32H7</b>正式投入生产 样品现已上市

    STM32H7教程】第19章 STM32H7的GPIO应用之按键FIFO

    STM32H7教程】第19章 STM32H7的GPIO应用之按键FIFO
    发表于 11-23 18:21 9次下载
    【<b class='flag-5'>STM32H7</b>教程】第19章 <b class='flag-5'>STM32H7</b>的GPIO应用之按键FIFO

    STM32H7学习之路继续(stm32H7系列3) GPIO

    STM32H7学习之路继续(stm32H7系列3) GPIO
    发表于 11-30 12:36 20次下载
    <b class='flag-5'>STM32H7</b>学习之路继续(<b class='flag-5'>stm32H7</b>系列3)  GPIO

    STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)

    STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)
    发表于 12-04 14:36 13次下载
    【<b class='flag-5'>STM32H7</b>教程】第21章 <b class='flag-5'>STM32H7</b>的NVIC中断分组和配置(重要)

    STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder

    STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder
    发表于 12-05 20:06 7次下载
    【<b class='flag-5'>STM32H7</b>教程】第8章 <b class='flag-5'>STM32H7</b>的终极调试组件Event Recorder

    STM32H7教程】第14章 STM32H7的电源,复位和时钟系统

    STM32H7教程】第14章 STM32H7的电源,复位和时钟系统
    发表于 12-09 11:21 36次下载
    【<b class='flag-5'>STM32H7</b>教程】第14章 <b class='flag-5'>STM32H7</b>的电源,复位和时钟系统

    核型号的微控制器STM32H7

      此外,STM32H7核版本包括一个开关模式电源 (SMPS),与使用更传统 LDO 的微控制器相比,可显着提高 MCU 的电源效率。
    的头像 发表于 05-15 17:19 1w次阅读

    AN5361_开始使用基于STM32CubeIDESTM32H7微控制器的项目

    AN5361_开始使用基于STM32CubeIDESTM32H7微控制器的项目
    发表于 11-21 08:11 3次下载
    AN5361_开始使用基于<b class='flag-5'>STM32</b>CubeIDE<b class='flag-5'>双</b>核<b class='flag-5'>STM32H7</b>微控制器的项目

    AN5361_STM32CubeIDE中基于STM32H7微控制器的项目入门

    AN5361_STM32CubeIDE中基于STM32H7微控制器的项目入门
    发表于 11-21 08:11 0次下载
    AN5361_<b class='flag-5'>STM32</b>CubeIDE中基于<b class='flag-5'>双</b>核<b class='flag-5'>STM32H7</b>微控制器的项目入门

    STM32H7技术详解

    电子发烧友网站提供《STM32H7技术详解.pdf》资料免费下载
    发表于 08-01 14:49 5次下载
    <b class='flag-5'>STM32H7</b>技术详解

    STM32H7核CM4作为Master初始化系统

    电子发烧友网站提供《STM32H7核CM4作为Master初始化系统.pdf》资料免费下载
    发表于 09-20 09:13 0次下载
    <b class='flag-5'>STM32H7</b><b class='flag-5'>双</b>核CM4作为Master初始化系统