我用的是rtt studio, 当不用qspi dma的时候,
STM32g474 qspi读取w25q64 id正常,后续的读写都正常。
如果在dma_config.h添加已下几个宏使用DMA1的通道1,程序死活不进中断:
#define QSPI_DMA_IRQHandler DMA1_Channel1_IRQHandler
#define QSPI_DMA_RCC RCC_AHB1ENR_DMA1EN
#define QSPI_DMA_INSTANCE DMA1_Channel1
#define QSPI_DMA_IRQ DMA1_Channel1_IRQn
#define QSPI_DMA_REQUEST DMA_REQUEST_QUADSPI
实际上,我即便修改如下两个中断函数名称,程序还是没跑进两个中断函数:
#ifdef BSP_QSPI_USING_DMA
//void QSPI_IRQHandler(void)
void QUADSPI_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();
HAL_QSPI_IRQHandler(&_stm32_qspi_bus.QSPI_Handler);
/* leave interrupt */
rt_interrupt_leave();
}
//void QSPI_DMA_IRQHandler(void)
void DMA1_Channel1_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();
HAL_DMA_IRQHandler(&_stm32_qspi_bus.hdma_quadspi);
/* leave interrupt */
rt_interrupt_leave();
}
#endif /* BSP_QSPI_USING_DMA */
导致程序一直停留在drv_qspi.c的qspixfer()中的while循环语句中死等:
后来我在cubeMx如下配置dma:
然后用cubeMx生成mdk工程,在main()函数调用以下库函数,能读取w25q64的id, 证明其实dma是能正常工作的:
HAL_QSPI_Command(&hqspi1, &qspi_cmd, 1000);
HAL_QSPI_Receive_DMA(&hqspi1, id);
另外,我还专门对比了mdk工程的MX_DMA_Init()、MX_QUADSPI1_Init()和我工程的参数配置都是一样的,让后SystemClock_Config()函数也是重新拷贝过去,结果还是不行。
为什么在rtt studio使用qspi dma就进不了中断呢?