|
有STM32用户欲使用STM32H743 的EXIT0 来同步触发DMA ,以实现SPI 发送数据。现用PE0 作为EXIT0 触发源,当把PE0 配置为外部中断模式,并使用DMAMUX 同步功能时,能够正常触发DMA 。但是,这种情况下有频繁进EXIT0 中断的困扰,他不想每次触发EXTI 中断响应,只想利用EXTI 事件触发DMA 传输,不知这种方式是否可行。他针对这种方式也做了尝试,发现没办法触发DMA 传输。他想知道这样到底行不行? 我们知道,针对STM32 芯片的GPIO 的电平跳变事件可以配置为 外部中断模式和外部事件模式。 外部中断模式用于在外部信号触发时产生中断请求(IRQ ),并可以软件配置是否需要CPU 来处理这个中断。 外部事件模式用于在外部信号触发时产生事件,但不产生中断请求(IRQ )。这种模式下,CPU 不会被打断,事件可以被CPU 或其它外设使用。 现在的问题是,如果PE0 配置成外部事件模式到底能不能用来同步启动SPI 的DMA 传输。我们一起来看看这个话题。 我们不妨先基于外部中断模式做下验证。这里大体要做的事情就是,PE0 配置成外部中断模式,上沿触发。SPI1 基于DMA 方式自发自收,SPI1 的DMA 发送需借助EXTI0 的外部中断事件做启动同步。 先看PE0 的配置,选择外部中断模式,上沿触发有效,平时下拉。另外,通过NVIC 启用CPU 对EXTI0 的中断响应。
下面是SPI 的DMA 配置,重点看SPI 发送的DMA 配置:
测试代码很简单。 我定义了用于SPI 收发的两个字符串数组。 uint8_t TXData[]="EXTI trig DMA"; uint8_t RXData[sizeof(TXData)]; 然后就是调用相关HAL 库函数,启用DMA 方式的SPI 收发。 HAL_SPI_TransmitReceive_DMA(&hspi1, ( uint8_t )TXData, (uint8_t )RXData,sizeof(TXData)); 我用跳线将PE0 管脚与高电平相连,产生触发。可以看到如下验证结果。
结果符合预期。 下面继续基于外部事件模式做验证。 配置方面只有PE0 的配置有变动,SPI 及DMA 的配置跟上面一样的。PE0 的配置变成下面样子,因为是事件模式,不存在NVIC 配置。
基于当前PE0 的配置和之前SPI 的DMA 配置,我们发现无论如何调整PE0 的电平都无法触发SPI 的传输。也就是说,基于GPIO的外部事件模式无法作为DMAMUX的同步触发信号。 那么,如果使用PE0 的外部中断模式,但又不启用它的中断响应会怎么样呢?也就是开篇客户的问题。我们来一起来看看。PE0 的配置如下,注意虽然选择了PE0 的外部中断模式,但我没有在NVIC 里开启它的中断响应。见下图配置:
基于上面PE0 配置和之前的SPI DMA 配置,我们经过测试,将PE0 接到高电平时是可以触发SPI 的DMA 传输的。我们再行验证,可以看到如下结果。见下图:
好,今天的话题就聊到这里,对于开篇的问题相信看官也有了结论。 文章出处:茶话MCU |
【开发经验】LAT1500 如何通过DMA配合CRC功能
经验分享 | STM32H723 SPI 通讯异常排查:实时观察窗口的 “隐形干扰” 解决方案
我心中的ST中文论坛
【STM32C0评测】4、驱动Lorasx126x,实现透传
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 使用GPIO+DMA+TIM模拟SPI通信演示
经验分享 | STM32 SPI半工单线通信示例
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 多个SPI的DMA传输为何仅1个有效?
经验分享 | STM32 DMAMUX应用示例
微信公众号
手机版