
请问一下,我想使用EXIT0来触发DMA实现SPI发送数据。我现在使用PB0作为EXIT0的触发源,我把PB0配置为外部中断模式,DMAMUX同步模式使能,选择EXIT0作为同步信号源,这种情况下是能够正常触发DMA的,但是这种情况下会一直频繁的进EXIT0的中断函数。我现在想不触发中断,使用EXIT0做事件触发DMA传输,请问下这种方式可不可行。我在网上看了说可行,具体就是把PB0配置成输入模式,EXIT0配置为事件触发,但是我做了尝试,发现没办法触发DMA传输,请问下有可能是什么问题? |
TouchGFX Designer下载工程到STM32H7S7-DK报错
Demo 例程
关于STM32H743VIT6 在用QSPI的接口,想换个CS的管脚,但芯片内置是绑死的,这个要怎么处理,用个其他的IO口做片选
定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常。测试官方用例一样,是何原因?
STM32H745XIH6不能进行双核调试,CM4不能进行在线调试
正点原子阿波罗H743使用DMA2D后普通刷出现问题
STM32U3 IIC通信后,SPI+GPDMA 进入循环发送,DMA无法使能 寄存器USEF=1
STM32CubeMX在配置DCMI的腳位時,在Mode的選項中, 只有8bits, 10bits與12bits, 為何沒有14bits?
STM32H7双核调试问题:CM7能成功调试但CM4始终报"Failed to read ROM table via AP 3"错误
MC SDK为什么不支持H743,看样子只支持H745H755
[md]这个思路是可以的。
更新事件或比较时间都可以,相信你这里要用的话 使用更新事件即可。
它产生触发的话,每次启动定时器后,就会周期性触发。 可以在DMA完成中断里关闭它,
需要做触发传输时就启动它。
经过验证,这里的GPIO必须配置外中断模式,如果配置外部事件模式是不行的。
但是,你配置位外部中断模式并非一定要做中断响应,即完全可以不启用NVIC的中断响应,
自然也就没有频繁进中断的说法。这些我都验证过了的。
你不妨再测试确认下。
我尝试过了,其他配置都不变,只要屏蔽以下两个函数,HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);DMA就无法正常触发,请问一下,是还需要做其他什么操作吗?
[md]GPIO还是依然配置成外部中断模式,不能配置为事件模式。
我是配置的中断模式
/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);
[md]现在有个很奇怪的问题,如果配置为中断上升沿触发,不开启EXIT0中断,可以触发;如果配置为中断下降沿触发,不开启EXIT0中断,就不能触发。这个是芯片有BUG吗?
[md]我昨天就就是上沿触发验证的。不应该有什么bug.
下降沿触发不开中断有问题,无法触发DMA。
的确有你说的现象。
因为还有其它STM32系列也支持该功能,我使用STM32G4开发板做了验证,
它就没有这个问题, 初步认为可能是个bug. 即基于下降沿触发且关闭中断响应
就不能做DMA的同步触发。
但有一点要提醒的是,如果使用外部中断模式而不启用中断响应,跳变沿触发后,中断
事件标志还是产生了的。建议在DMA完成中断里将相关标志及时清除,为下次
有效触发做准备。
好的,谢谢,我这里的使用环境就是要少进中断,如果开启DMA传输完成中断,那就是和开EXTI0中断一样了,所以现在换一种思路,可不可以用TIM12TRGO来触发,这个TIM12TRGO是指定时器更新事件吗?