[STM32H7] usb音频短时间正常工作后会卡死

[复制链接]
143|17
lilaiju 发表于 2026-8-13 20:28 | 显示全部楼层 |阅读模式

将一路 USB 音频接入 STM32H743 主机端口,起初可稳定以 48kHz 采样率正常传输约 5 秒,随后音频数据就彻底卡死。

帧起始信号依旧正常触发中断,官方中断驱动里的`AudioHost_IsoDataReadyISR()`音频等时数据就绪中断也会持续调用;DMA 处于运行状态,但后续每次传输的始终是相同的 96 字节数据:即便我清空接收缓冲区,缓冲区很快又会被重复的旧数据重新填满。我重新初始化管道等一系列操作,都无法恢复音频流。

只要处理`AudioHost_IsoDataReadyISR()`中断的过程稍有延迟,就会立刻出现一模一样的重复旧数据卡死问题。

代码基于 ST 官方示例自行编写,音频正常播放数秒无问题;拔掉麦克风再重新插上,音频又能短暂流畅运行数秒,之后依旧卡死。
当处理`AudioHost_IsoDataReadyISR()`中断出现时序偏差时,有没有可行的方案,无需整机复位就能恢复音频流媒体传输?

又见江南雨 发表于 2026-8-14 15:51 | 显示全部楼层
ISO IN端点不会硬件自动重传,数据包没拿到就丢了,HAL库的PCD层如果没及时清理RxFIFO,HC就会一直取同一个缓冲区的数据。
classroom 发表于 2026-8-14 17:20 | 显示全部楼层
收96字节固定数据说明DMA描述符的地址指针没自增,要检查DMA的循环模式配置,普通模式下描述符写一次之后需要软件更新地址。
cr315 发表于 2026-8-14 19:30 | 显示全部楼层
帧间隔微帧125us,中断里最好不要做浮点或打印,H7开cache的情况下处理时间超标,MMU没配置好会触发额外的cache回写延迟。
duo点 发表于 2026-8-14 21:53 | 显示全部楼层
拔掉再插能恢复是因为USB复位把端点硬件状态机重置了,说明问题出在主机侧端点停等状态没有软件复位机制。
flycamelaaa 发表于 2026-8-15 10:34 | 显示全部楼层
不能整机复位那就复位USB主机控制器,H7的USB_DRD模块支持软复位,把HCD寄存器里的HC_RESET位写1可以清掉内部状态。
jcky001 发表于 2026-8-15 12:48 | 显示全部楼层
等时传输管道是周期性轮询,需要在每帧SOF中断里检查管道状态,如果发现数据就绪ISR一直在触发但数据没更新,多半是URB状态机卡在等待重传。
onlycook 发表于 2026-8-15 15:18 | 显示全部楼层
H7的DMA FIFO有阈值设置,如果总线带宽被LTDC或ETH抢占了,DMA取数不及时会把FIFO读空导致数据重复。
powerantone 发表于 2026-8-15 19:55 | 显示全部楼层
逻辑分析仪抓一下SOF到数据包的时序偏移,如果主机在微帧后半段才发IN令牌,设备返回的数据可能会跨帧边界,主机来不及处理就复用上一帧。
probedog 发表于 2026-8-15 21:55 | 显示全部楼层
看下OTG_HS核心的周期性帧列表是不是只有一个描述符在转,等时传输需要把描述符链起来,单描述符模式下HC不会自动加载新的。
solty 发表于 2026-8-16 11:30 | 显示全部楼层
把等时传输的缓冲区大小设成整数倍的微帧最大包,96字节正好是48kHz双声道16bit的1ms数据量,如果分包大小不对,最后一个不完整包会导致卡死。
spicy 发表于 2026-8-16 14:43 | 显示全部楼层
官方的AudioHost_IsoDataReadyISR中断里通常会调用USB_Host_HandleISOC和HAL_HCD_HC_NotifyURBChange,检查这两个函数有没有被正确编译链接。
内政奇才 发表于 2026-8-16 15:57 | 显示全部楼层
H7的DCache需要手动CleanInvalidate,数据来了先调用SCB_CleanInvalidateDCache_by_Addr刷新缓存,否则CPU读到的***是缓存里的旧数据。
又见江南雨 发表于 2026-8-16 19:58 | 显示全部楼层
把USB中断优先级设成最高的0,同时把等时管道描述符中的处理回调改成直接操作,不要在中断里用信号量或消息队列触发任务。
海滨消消 发表于 2026-8-16 20:17 | 显示全部楼层
插入拔出能恢复说明USB协议栈的状态机在设备拔出事件里执行了完整的去初始化,反过来说明卡死状态缺少一个专门的等时管道重置函数。
狄克爱老虎油 发表于 2026-8-14 18:22 | 显示全部楼层
这问题我也遇到过,可能是采样率转换引起的缓存溢出,检查一下寄存器FIFO阈值和采样率设置。
光影捕手 发表于 2026-8-15 17:15 | 显示全部楼层
检查DMA描述符地址指针是否正确自增,确保DMA循环模式配置正确。同时,考虑优化`AudioHost_IsoDataReadyISR()`中断处理,避免长时间占用CPU。
云上漫步 发表于 2026-8-16 14:16 | 显示全部楼层
检查DMA描述符地址指针,确保自增正确,同时优化`AudioHost_IsoDataReadyISR()`中断处理,减少CPU占用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

192

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0