RT-Thread论坛
直播中

李燕

8年用户 1637经验值
私信 关注

在rtt studio使用qspi dma就是进不了中断,为什么?

我用的是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循环语句中死等:

QQ截图20240927115252.png
后来我在cubeMx如下配置dma:

22.png

然后用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就进不了中断呢?

回帖(1)

jfsky

2024-9-29 16:32:13
在使用RTT Studio开发STM32G474的QSPI DMA时,如果程序无法进入中断,可能是由于以下几个原因导致的:

1. **中断优先级配置错误**:确保DMA中断的优先级配置正确。在STM32中,中断优先级需要在NVIC中正确设置。

2. **DMA通道配置错误**:检查DMA通道的配置是否正确,包括源地址、目标地址、传输大小等。

3. **QSPI配置错误**:确保QSPI的配置与DMA传输兼容,包括时钟、数据宽度等。

4. **中断服务例程(ISR)未正确配置**:确保中断服务例程(ISR)正确配置,并且与DMA中断向量匹配。

5. **DMA传输完成标志未正确处理**:在DMA传输完成后,需要检查传输完成标志,并在ISR中清除该标志。

6. **硬件问题**:检查硬件连接是否正确,包括QSPI和DMA的引脚连接。

7. **代码问题**:检查代码中是否有逻辑错误,导致中断无法触发。

针对你提供的宏定义,这里有一些可能的检查点:

- **QSPI_DMA_IRQHandler**:确保这个宏定义指向的是正确的中断处理函数。
- **QSPI_DMA_RCC**:确保这个宏定义启用了正确的DMA时钟。
- **QSPI_DMA_INSTANCE**:确保这个宏定义指向了正确的DMA实例。

此外,你可以尝试以下步骤来调试问题:

1. **使用调试器**:使用调试器逐步执行代码,查看中断是否被触发。
2. **检查中断使能**:确保在代码中正确使能了DMA中断。
3. **检查中断向量表**:确保中断向量表中的DMA中断向量指向了正确的ISR。
4. **检查NVIC配置**:确保NVIC中的中断优先级和使能位配置正确。

如果以上步骤都无法解决问题,建议查看STM32的参考手册和RTT Studio的文档,以确保所有配置都是正确的。同时,也可以查看社区论坛或者官方支持,看看是否有其他人遇到类似问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分