[STM32L4] Nucleo项目在系统内存中挂起

[复制链接]
534|16
 楼主| 梧桐uuu 发表于 2025-7-19 09:51 | 显示全部楼层 |阅读模式
使用STM32CubeIDE在NUCLEO-l4r5zi开发板上使用ST-LINK进行调试。
创建一个新项目,选择NUCLEO-l4r5zi开发板。
使用默认设置创建项目——能够正常调试并单步执行main()函数。
在main函数的最后while(1)循环前添加printf("Entering while loop\n")。
在USB初始化过程中,程序会在USB_SetCurrentMode()里的HAL_Delay(50u)调用时陷入系统存储器区域循环。系统被锁死。
注释掉HAL_Delay调用后,printf输出"Entering ",随后仍会陷入系统存储器区域。
尝试将Min_Stack和Min_Heap增加到128K,但问题依旧。
使用int __io_putchar(int ch)重定向STDOUT不会导致此问题,仅添加printf时会出现。
请教这种问题如何解决?

公羊子丹 发表于 2025-7-23 07:25 | 显示全部楼层
我之前也遇到过,printf 里用了 HAL_Delay 或阻塞 IO,结果卡在 HardFault 里。
周半梅 发表于 2025-7-23 07:26 | 显示全部楼层
STM32 的 printf 底层其实会调 __io_putchar,要是重定向没配好,很容易跑飞。
帛灿灿 发表于 2025-7-23 07:29 | 显示全部楼层
你用的 printf 是不是用到 semihosting?有时候没连调试器就挂在 system call 里了。
童雨竹 发表于 2025-7-23 07:30 | 显示全部楼层
试试把 printf 换成 puts 或 HAL_UART_Transmit,看是不是标准库实现卡住了。
万图 发表于 2025-7-23 07:32 | 显示全部楼层
如果 USB 和 printf 同时用,注意不要在中断里 printf,会锁死系统。
Wordsworth 发表于 2025-7-23 07:34 | 显示全部楼层
可以打开 HardFault_Handler 看看具体是跑飞到哪儿去的,有时候是堆栈溢出。
Bblythe 发表于 2025-7-23 07:36 | 显示全部楼层
有些 C 库的 printf 会调用 malloc,新项目的话最小堆不够也会卡死。
Pulitzer 发表于 2025-7-23 07:38 | 显示全部楼层
你用的 printf 是微库还是完整库?micro-lib 下有时候不支持复杂格式化。
Uriah 发表于 2025-7-23 07:40 | 显示全部楼层
如果一定要 printf,推荐直接重定向到串口,别走 semihosting。
Uriah 发表于 2025-7-23 07:42 | 显示全部楼层
HAL_Delay 本身没问题,大概率是 printf + USB 初始化冲突导致,拆开调试最稳妥。
flycamelaaa 发表于 2025-7-23 15:06 | 显示全部楼层
USB中断优先级冲突?
cr315 发表于 2025-7-23 15:12 | 显示全部楼层
禁用系统存储器跳转,在main()开头禁用调试接口的重定向。
豌豆爹 发表于 2025-7-23 15:16 | 显示全部楼层
检查中断优先级和时钟配置,这是USB挂起的常见原因。
jcky001 发表于 2025-7-23 15:55 | 显示全部楼层
检查中断优先级配置,USB中断优先级不低于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。
powerantone 发表于 2025-7-23 16:07 | 显示全部楼层
中断优先级配置不当可能导致系统锁死。
海滨消消 发表于 2025-7-23 16:46 | 显示全部楼层
检查链接脚本,堆栈大小在STM32L4R5ZITx_FLASH.ld中是否被正确设置。
stormwind123 发表于 2025-7-23 17:07 | 显示全部楼层
HAL_Delay()依赖SysTick中断,若USB中断优先级过高或SysTick被禁用,会引发冲突。
stormwind123 发表于 2025-7-23 19:09 | 显示全部楼层
可能是时钟配置错误、Flash访问权限问题或硬件引脚冲突。
probedog 发表于 2025-7-23 20:10 | 显示全部楼层
可能是缓冲区溢出或堆栈问题引起的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

58

帖子

0

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