ST意法半导体
直播中

名士流

9年用户 984经验值
私信 关注
[问答]

STM32F407高速USB Device模式在外部中断15响应后发送4K个数据,外部中断循环给出,导致一部分外部中断接收不到怎么解决?

  外部中断间隔时间80us,共8000个,80us时间USB发送4KByte数据,外部中断会少100多个。如果把USB发送屏蔽掉,8000个中断都能正常响应。所以还是USB发送打断了外部中断响应,还有个问题是,用示波器查看CDC_Transmit_HS函数发送4KByte,执行完只需要几个us。USB发送的机制到底是什么样的,是不是虽然CDC_Transmit_HS函数执行完了,不代表发送完成了,后台模块还会占用单片机资源,进行发送。有没有解决办法,期待回复,谢谢了。

回帖(1)

韩刚龙

2025-3-10 17:44:20

问题分析




  1. 外部中断丢失:外部中断间隔为80us,共8000个中断,但在USB发送4K数据时,外部中断会丢失100多个。屏蔽USB发送后,所有中断都能正常响应。这表明USB发送过程可能占用了过多的CPU资源或中断优先级设置不当,导致外部中断无法及时响应。




  2. USB发送机制CDC_Transmit_HS函数执行时间仅为几个us,但实际USB发送过程可能涉及更多的后台处理,如DMA传输、USB协议栈处理等。这些后台操作可能占用CPU资源或中断优先级,导致外部中断无法及时响应。




解决方案




  1. 提高外部中断优先级



    • 确保外部中断的优先级高于USB相关中断的优先级。在STM32中,可以通过配置NVIC(Nested Vectored Interrupt Controller)来设置中断优先级。

    • 例如,将外部中断15的优先级设置为最高,确保它能够及时响应。




  2. 优化USB发送过程



    • 使用DMA(直接内存访问)进行USB数据传输,减少CPU的负担。DMA可以在不占用CPU的情况下完成数据传输,从而让CPU有更多时间处理外部中断。

    • 确保USB发送的DMA通道优先级高于其他DMA通道,以避免DMA传输过程中被其他任务打断。




  3. 减少USB发送的阻塞时间



    • 如果USB发送过程是阻塞的,尝试将其改为非阻塞方式。例如,使用环形缓冲区(Ring Buffer)来存储待发送的数据,并在后台任务中逐步发送数据,而不是一次性发送4K数据。

    • 这样可以减少USB发送对CPU的占用时间,让外部中断有更多的机会被处理。




  4. 优化中断处理函数



    • 确保外部中断处理函数尽可能简短,避免在中断处理函数中进行复杂的操作或长时间占用CPU。

    • 如果需要在中断处理函数中进行复杂的处理,可以考虑将处理逻辑移到主循环或后台任务中,通过标志位或队列来传递数据。




  5. 使用RTOS(实时操作系统)



    • 如果系统复杂度较高,可以考虑使用RTOS来管理任务和中断。RTOS可以帮助更好地调度任务和中断,确保高优先级任务和中断能够及时得到处理。




示例代码(提高外部中断优先级)


// 配置外部中断15的优先级
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);  // 设置优先级为最高
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);         // 使能外部中断15

总结


通过提高外部中断的优先级、优化USB发送过程、减少USB发送对CPU的占用时间,以及优化中断处理函数,可以有效解决外部中断丢失的问题。如果系统复杂度较高,还可以考虑使用RTOS来更好地管理任务和中断。

举报

更多回帖

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