[STM32F4] STM32CubeIDE 设置 FreeRTOS 和 USB 主机

[复制链接]
800|10
 楼主| 石榴大王 发表于 2025-4-4 10:30 | 显示全部楼层 |阅读模式
STM32 F4 Discovery 板, STM32CubeIDE在设备配置工具窗口中同时启用了 FreeRTOS 和 USB_Host。已将 System Core 中的 SYS 更改为使用 TIM6。
在调试模式下编译和运行,但在运行 xPortStartScheduler() 时,由于 osKernelStart() 调用而卡在在 HardFault_Hander() 中。
USB_HOST配置为虚拟 COM 端口或 HID,会出现同样的问题,但如果将 FS IP 的类设置为禁用,即禁用 USB,FreeRTOS 运行良好。
LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 位是 5。
在USB_OTG_FS、NVIC 设置中,USB On The Go FS 全局中断已启用,并且具有抢占优先级 5、子优先级 0。
使用 FreeRTOS 时,如何配置 USB 主机才能正常工作?

公羊子丹 发表于 2025-4-5 07:40 | 显示全部楼层
你这个现象很像是中断优先级的问题,FreeRTOS要求使用的中断优先级必须大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,USB的中断也得注意这一点。
周半梅 发表于 2025-4-5 07:41 | 显示全部楼层
试着把USB_OTG_FS的NVIC优先级调到6或7看看,我之前就是设成5,然后和FreeRTOS起冲突直接HardFault。
帛灿灿 发表于 2025-4-5 07:42 | 显示全部楼层
你的configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY是5,那你所有调用FreeRTOS API的中断优先级都必须是大于5的,不能等于5。
童雨竹 发表于 2025-4-5 07:43 | 显示全部楼层
有时候USB Host stack默认就用了FreeRTOS的API(比如消息队列、内存分配),一旦中断优先级不对就会直接崩。
万图 发表于 2025-4-5 07:44 | 显示全部楼层
你试试在CubeMX生成代码后手动检查usb_host.c里的任务创建位置,是不是在MX_FREERTOS_Init()之前被调用了?顺序也会影响系统稳定。
Wordsworth 发表于 2025-4-5 07:45 | 显示全部楼层
USB Host中有个HCD的IRQ Handler,那个优先级也要符合FreeRTOS的中断要求,你可以在stm32f4xx_it.c中查一下是不是用错了。
Bblythe 发表于 2025-4-5 07:45 | 显示全部楼层
你有没有加osDelay或vTaskDelay来等USB初始化?有些例子是main函数一口气跑完,结果还没初始化就开始调度了。
Pulitzer 发表于 2025-4-5 07:46 | 显示全部楼层
推荐你打开硬件断点,看HardFault是在哪条汇编指令上卡住,看看是不是访问非法内存或者栈溢出了。
Uriah 发表于 2025-4-5 07:47 | 显示全部楼层
USB Host一开始初始化时占的stack空间不小,建议你把默认task的stack size拉大一点,比如调到512或1024看看还有没有HardFault。
Clyde011 发表于 2025-4-5 07:48 | 显示全部楼层
你可以试一下ST提供的USB Host+FreeRTOS的例程,比如在STM32CubeF4固件包里F429I-DISCO就有现成demo,可以参考一下他们的任务创建和优先级配置方式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

56

帖子

0

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