打印
[STM32F4]

STM32CubeIDE 设置 FreeRTOS 和 USB 主机

[复制链接]
381|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。

使用特权

评论回复
5
童雨竹| | 2025-4-5 07:43 | 只看该作者
有时候USB Host stack默认就用了FreeRTOS的API(比如消息队列、内存分配),一旦中断优先级不对就会直接崩。

使用特权

评论回复
6
万图| | 2025-4-5 07:44 | 只看该作者
你试试在CubeMX生成代码后手动检查usb_host.c里的任务创建位置,是不是在MX_FREERTOS_Init()之前被调用了?顺序也会影响系统稳定。

使用特权

评论回复
7
Wordsworth| | 2025-4-5 07:45 | 只看该作者
USB Host中有个HCD的IRQ Handler,那个优先级也要符合FreeRTOS的中断要求,你可以在stm32f4xx_it.c中查一下是不是用错了。

使用特权

评论回复
8
Bblythe| | 2025-4-5 07:45 | 只看该作者
你有没有加osDelay或vTaskDelay来等USB初始化?有些例子是main函数一口气跑完,结果还没初始化就开始调度了。

使用特权

评论回复
9
Pulitzer| | 2025-4-5 07:46 | 只看该作者
推荐你打开硬件断点,看HardFault是在哪条汇编指令上卡住,看看是不是访问非法内存或者栈溢出了。

使用特权

评论回复
10
Uriah| | 2025-4-5 07:47 | 只看该作者
USB Host一开始初始化时占的stack空间不小,建议你把默认task的stack size拉大一点,比如调到512或1024看看还有没有HardFault。

使用特权

评论回复
11
Clyde011| | 2025-4-5 07:48 | 只看该作者
你可以试一下ST提供的USB Host+FreeRTOS的例程,比如在STM32CubeF4固件包里F429I-DISCO就有现成demo,可以参考一下他们的任务创建和优先级配置方式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

14

帖子

0

粉丝