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

STM32H743使用EXIT0触发SPI的DMA发送数据

[复制链接]
炯john 提问时间:2025-3-17 11:01 / 已解决

请问一下,我想使用EXIT0来触发DMA实现SPI发送数据。我现在使用PB0作为EXIT0的触发源,我把PB0配置为外部中断模式,DMAMUX同步模式使能,选择EXIT0作为同步信号源,这种情况下是能够正常触发DMA的,但是这种情况下会一直频繁的进EXIT0的中断函数。我现在想不触发中断,使用EXIT0做事件触发DMA传输,请问下这种方式可不可行。我在网上看了说可行,具体就是把PB0配置成输入模式,EXIT0配置为事件触发,但是我做了尝试,发现没办法触发DMA传输,请问下有可能是什么问题?

收藏 评论11 发布时间:2025-3-17 11:01

举报

11个回答
xmshao 最优答案 回答时间:2025-3-20 17:25:56

炯john 发表于 2025-3-20 16:01
好的,谢谢,我这里的使用环境就是要少进中断,如果开启DMA传输完成中断,那就是和开EXTI0中断一样了 ...

[md]这个思路是可以的。

更新事件或比较时间都可以,相信你这里要用的话 使用更新事件即可。

它产生触发的话,每次启动定时器后,就会周期性触发。 可以在DMA完成中断里关闭它,

需要做触发传输时就启动它。

xmshao 回答时间:2025-3-17 14:09:01
我这边也找了STM32H7开发板,针对你描述的问题做了验证。


经过验证,这里的GPIO必须配置外中断模式,如果配置外部事件模式是不行的。


但是,你配置位外部中断模式并非一定要做中断响应,即完全可以不启用NVIC的中断响应,


自然也就没有频繁进中断的说法。这些我都验证过了的。



你不妨再测试确认下。
炯john 回答时间:2025-3-17 14:45:44

xmshao 发表于 2025-3-17 14:09
我这边也找了STM32H7开发板,针对你描述的问题做了验证。</p>
<p>

我尝试过了,其他配置都不变,只要屏蔽以下两个函数,HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);DMA就无法正常触发,请问一下,是还需要做其他什么操作吗?

xmshao 回答时间:2025-3-17 16:06:22

炯john 发表于 2025-3-17 14:45
我尝试过了,其他配置都不变,只要屏蔽以下两个函数,HAL_NVIC_SetPriority(EXTI0<em>IRQn, 0, 0);
HAL</em> ...

[md]GPIO还是依然配置成外部中断模式,不能配置为事件模式。

炯john 回答时间:2025-3-17 16:13:42

xmshao 发表于 2025-3-17 16:06
GPIO还是依然配置成外部中断模式,不能配置为事件模式。

我是配置的中断模式

炯john 回答时间:2025-3-17 16:16:40

炯john 发表于 2025-3-17 16:13
我是配置的中断模式

/Configure GPIO pin : PB0 / GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/ SPI2_TX Init / hdma_spi2_tx.Instance = DMA1_Stream0; hdma_spi2_tx.Init.Request = DMA_REQUEST_SPI2_TX; hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_spi2_tx.Init.Mode = DMA_CIRCULAR; hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW; hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_spi2_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_spi2_tx.Init.MemBurst = DMA_MBURST_SINGLE; hdma_spi2_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK) { Error_Handler(); }

pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_EXTI0; pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_FALLING; pSyncConfig.SyncEnable = ENABLE; pSyncConfig.EventEnable = DISABLE; pSyncConfig.RequestNumber = 6; if (HAL_DMAEx_ConfigMuxSync(&hdma_spi2_tx, &pSyncConfig) != HAL_OK) { Error_Handler(); }

以上就是相关的配置。我只要使用下面两个函数使能中断就能触发DMA传输,如果不使用下面两个函数使能中断就不能触发DMA传输。

HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);

炯john 回答时间:2025-3-18 15:50:38

炯john 发表于 2025-3-17 16:16
/<em>Configure GPIO pin : PB0 </em>/
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MO ...

[md]现在有个很奇怪的问题,如果配置为中断上升沿触发,不开启EXIT0中断,可以触发;如果配置为中断下降沿触发,不开启EXIT0中断,就不能触发。这个是芯片有BUG吗?

xmshao 回答时间:2025-3-18 18:02:56

炯john 发表于 2025-3-18 15:50</p>
<p>[md]现在有个很奇怪的问题,如果配置为中断上升沿触发,不开启EXIT0中断,可以触发;如果配置为中断下 ...

[md]我昨天就就是上沿触发验证的。不应该有什么bug.

炯john 回答时间:2025-3-18 18:15:06

xmshao 发表于 2025-3-18 18:02
我昨天就就是上沿触发验证的。不应该有什么bug.

下降沿触发不开中断有问题,无法触发DMA。

xmshao 回答时间:2025-3-19 17:50:01
针对你的进一步反馈,我用STM32H7开发板再次做了验证测试,经过反复验证,


的确有你说的现象。


因为还有其它STM32系列也支持该功能,我使用STM32G4开发板做了验证,


它就没有这个问题, 初步认为可能是个bug. 即基于下降沿触发且关闭中断响应


就不能做DMA的同步触发。


但有一点要提醒的是,如果使用外部中断模式而不启用中断响应,跳变沿触发后,中断


事件标志还是产生了的。建议在DMA完成中断里将相关标志及时清除,为下次


有效触发做准备。
炯john 回答时间:2025-3-20 16:01:42

xmshao 发表于 2025-3-19 17:50
针对你的进一步反馈,我用STM32H7开发板再次做了验证测试,经过反复验证,</p>
<p>

好的,谢谢,我这里的使用环境就是要少进中断,如果开启DMA传输完成中断,那就是和开EXTI0中断一样了,所以现在换一种思路,可不可以用TIM12TRGO来触发,这个TIM12TRGO是指定时器更新事件吗?

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版