最近有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、注意初始化代码往往是有顺序要求的;
说实在的,本咨询话题涉及的内容及知识点可能有点多,在此不能一一详述。本人分享此应用演示的主要目的,是希望给关注本应用话题的人一些实现参考。能实现,可以实现,给遇到相应困难的同仁以信心。
关键字:STM32H7 EXTI SPI DMA 双缓冲
引用地址:
基于STM32H7 EXTI+SPI+DMA双缓冲应用演示
推荐阅读最新更新时间:2024-11-03 03:11
发现STM32的SPI2有问题(invalid)
最近需要用到SPI1和SPI2协同工作,想弄个2位的SPI通信: 硬件的接线如下: SPI1.SCK - DEV.SCK SPI1.SCK - SPI2.SCK SPI1.MOSI - DEV.MOSI SPI1.MISO - DEV.MISO SPI2.MISO - DEV.MOSI SPI2.MOSI - DEV.MISO 将SPI1设置为Master方式,将SPI2设置为Slave。 设置为CPOL=0,CPHA=0(就是不传输的时候时钟是低电平,上升沿采样,下降沿更新数据)。 具体的配置就不贴了,在stm32fwlib的例子里面有。 注意:官方和网上能用的配置都是SPI1是Slave、SPI2为Master!接下来会说。
[单片机]
msp430之DMA控制器
1.只有F15/16x具有DMA(Direct Memory Access是一种不经过CPU而直接从内存了存取数据的数据交换模式。)为数据告诉传输提供保证。(例如,利用DMA控制器可以直接将ADC转换存储器的内容传送到RAM中)处理数据,而非处理任务。 2.特性: 数据传送无需CPU 块传输可达到65536字节 提高片内外设吞吐能力,每个字或者字节仅需2个MCLK 处理数据是CPU处于低功耗 字节和字可以混合传输 四种传输寻址模式:固定地址到固定地址,固定地址到块地址,块地址到固定地址,块地址到块地址。 触发方式灵活:边沿或电平 单个、块、或突发块传输模式:每次触发DMA操作,可根据需要传输不同模式数据。 3.结构 三个独立的传输
[单片机]
CAN、USART、SPI、SCI等常见总线技术介绍
任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU直接连接,那么连线将会错综复杂,甚至难以实现。为了简化硬件电路设计、简化系统结构,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线。采用总线结构便于部件和设备的扩充,尤其制定了统一的总线标准则容易使不同设备间实现互连。
微机中总线一般有内部总线、系统总线和外部总线。内部总线是微机内部各外围芯片与处理器之间的总线,用于芯片一级的互连;而系统总线是微机中各插件板与系统板之间的总线,用于插件板一级的互连;外部总线则是微机和外部设备之间的总线,微机作为一种设备,通过该总线
[嵌入式]
STM32F4 ADC模块使用不同DMA模式的区别和对比
这些细节在STM32F4的原厂参考手册中没有说明,只是很简短的列了一下。 我是查看ST前几天刚发布的接口库才最后弄明白的,不敢独享! 1、STM32F4有3个独立的ADC单元,性能强劲,可以独立使用,也可以联合使用它们。 联合使用在参考手册中叫Interleave模式,最大的目的是加倍提升采样速度。 2、采样速度大幅提高以后,就需要使用DMA来配合提取采样结果,从而发挥STM32F4 ADC模块的最大效能。 3、ADC模块使用DMA有4种模式可选,默认模式和模式1没有什么特别之处。 最有意思的是模式2和模式3: 模式2可以选择多达3个ADC模块工作于Interleave模式,ADC速度从单一模块的
[单片机]
STM32外部中断的关闭和打开
注:库函数没有现成的函数打开和关闭外部中断 在某些时候我们希望暂时的关闭某条外部中断,以免造成误触发,此时可以使用下面的操作: 关闭: EXTI- IMR &= ~(EXTI_Linex); 开启: EXTI- IMR |= EXTI_Linex; 其中EXTI_Linex为指定的中断线。 原理可以参考《STM32参考手册》 中断屏蔽寄存器处。
[单片机]
PIC16F887 RB0外部中断(2)
#include pic.h #include pic16f887.h __CONFIG (CP_OFF&WDTE_OFF&BOREN_ON&PWRTE_OFF&FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF); /*配置位 CP_OFF,代码保护位,程序存储器代码保护关闭; WDTE_OFF,看门狗定时器使能位,看门狗定时器关闭,可以通过WDTCON寄存器的SWDTEN位使能; BOREN_OFF,掉电复位选择位,掉电复位关闭; PWRTE_OFF,上电定时器使能位,上电定时器关闭; FOSC_HS,振荡器选择位,高速晶振或谐振器在RA6/OSC2/CLKOUT和RA7/OSC1/CL
[单片机]
ADSP2106x中DMA的应用
摘 要: 直接内存存取(DMA)是DSP芯片中用于快速数据交换的重要技术,对AD公司的浮点系列芯片ADSP2106x中的DMA的应用进行了详细介绍,并给出实际应用中的一些例子。
关键词: DMA 浮点系列芯片ADSP2106x
1 DMA概述
直接内存存取(DMA)对计算机系统是非常重要的。它可以使CPU在运行指令的同时,系统能实现从外部存储器或设备中存取数据,也可以在CPU不参与的情况下,由专用的DMA设备存取数据。
对于浮点DSP芯片来讲,DMA的作用更是重要。众所周知,DSP芯片主要是面向实时的信号处理,其核心的运算部件具有很高的运算速度,常以MFLOPS(每秒百万次浮点
[应用]
STM32外部中断详解
一、基本概念 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组 第0组:所有4bit用于指定响应优先级; 第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; 第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; 第3组
[单片机]