ST意法半导体
直播中

李梅

8年用户 1440经验值
私信 关注
[问答]

求助,关于STM32F407 DMA NVIC设置的疑问求解

  采用STM32F407, DMA1 stream5(request: usart2_rx)  DMA1 stream6(usart2_tx), USART2 global interrupt优先级设置为1,1; STREAM5,STREAM6 GLOBAL INTERRUPT优先级设置为0,0;
请问:NVIC设置中DMA1 STREAM5 GLOBAL INTERRUPT 和DMA1 STREAM6 GLOBAL INTERRUPT都已经选择了ENABLED, 但是是灰色显示的,而USART2 global interrupt也选择了ENALBED,但是是可以修改的状态;灰色不可修改的状态是什么意思?
在串口有数据接收时,是怎么调用中断服务程序的,先调DMA1_stream5_IRQHandler(void)还是先调USART2_IRQHnalder(void)?
调试时只发现程序调用了USART2_IRQHANDLER?不知道正不正确?
谢谢指点!

回帖(2)

陈秀英

2025-3-2 14:20:01

在STM32F407中,关于DMA和NVIC的中断配置与调用顺序问题,以下是关键点的解答和解释:




1. NVIC中灰色中断使能的含义



  • 灰色不可修改:在CubeMX等配置工具中,如果某个中断通道的使能(Enabled)状态显示为灰色,通常是因为该中断的使能条件由外设的配置自动控制,而非手动选择。例如:

    • 当你在USART的DMA配置中勾选了Transfer Complete InterruptError Interrupt时,CubeMX会自动在NVIC中使能对应的DMA Stream中断,此时NVIC的使能选项会被锁定(灰色)。

    • 而USART的中断(如RXNE接收中断或TXE发送中断)需要手动配置,因此其NVIC使能状态是可修改的。


  • 解决方法:检查DMA配置中是否启用了中断事件(如传输完成中断)。如果不需要自动使能,需在外设的DMA配置中取消相关中断选项。




2. 中断服务程序的调用顺序


中断的触发和响应顺序由以下因素决定:



  • 优先级数值:STM32的优先级数值越小,优先级越高。  

    • 在你的配置中,DMA Stream5/6的中断优先级为0,USART2的中断优先级为1,因此DMA中断会优先于USART2中断被响应。


  • 中断触发条件

    • DMA中断:由DMA传输完成(TC)、传输错误(TE)等事件触发。

    • USART中断:由USART事件(如数据接收完成RXNE、发送完成TC、空闲线路IDLE等)触发。



典型场景分析




  • 接收数据时



    1. DMA接收完成:当DMA收到指定长度的数据后,会触发DMA1_Stream5_IRQHandler

    2. USART空闲中断:如果启用了USART的IDLE中断,在总线空闲时会触发USART2_IRQHandler,此时可在该中断中处理不定长数据。

      • 优先级顺序:由于DMA中断优先级更高,若两者同时触发,会先执行DMA1_Stream5_IRQHandler,再执行USART2_IRQHandler





  • 发送数据时



    • 若使用DMA发送,通常只需等待DMA传输完成中断(DMA1_Stream6_IRQHandler),无需USART发送中断。






3. 关键配置建议



  • DMA中断配置

    • 在CubeMX中,确保DMA Stream的Transfer Complete Interrupt已启用(这会自动使能NVIC中的中断)。

    • 在代码中实现DMA中断服务函数(如DMA1_Stream5_IRQHandler),并处理TCTE标志。


  • USART中断配置

    • 若需要处理空闲中断(IDLE),需在USART配置中启用IDLE中断,并在USART2_IRQHandler中检查IDLE标志。

    • 清除中断标志的时序需严格遵循手册(如先读SR再读DR以清除RXNE)。





4. 示例代码片段


// DMA接收完成中断处理
void DMA1_Stream5_IRQHandler(void) {
  if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5)) {
    // 处理接收完成逻辑
    DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5);
  }
}

// USART2中断处理
void USART2_IRQHandler(void) {
  if (USART_GetITStatus(USART2, USART_IT_IDLE)) {
    // 处理空闲中断(用于不定长数据)
    USART_ReceiveData(USART2); // 清除IDLE标志
  }
}



总结



  • 灰色NVIC使能:表示中断由外设配置自动管理,无需手动修改。

  • 中断调用顺序:DMA中断优先级高于USART中断,但具体触发逻辑需结合事件类型(如DMA传输完成或USART空闲)。

  • 最佳实践:结合DMA和USART中断实现高效数据收发(如DMA+IDLE中断处理不定长数据)。


如有进一步问题,建议检查CubeMX配置并参考STM32F4xx参考手册的DMA和USART章节。

举报

冯栋

2025-3-13 16:13:13
1、中断优先级你根据各个中断响应优先需求来设置。一般来讲,在中断事件不多且中断服务程序都比较简洁时,优先级都设置一样也问题不大。
在系统功能复杂,中断众多时,优先级的合理安排就显得很重要了。


2、你在cubeMx配置里看到DMA中断使能是灰色时,这里表示不能手动,CubeMx已经默认帮我使能DMA相关中断响应了。
举报

更多回帖

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