梧桐uuu 发表于 2025-7-19 09:51

Nucleo项目在系统内存中挂起

使用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-24 07:18

你这个看起来像是 printf 的 syscalls 没配置好,卡到 _write 里了吧?

周半梅 发表于 2025-7-24 07:19

有没有开 USE_SEMIHOSTING?Nucleo 用 ST-LINK 半主机模式会进 HardFault。

帛灿灿 发表于 2025-7-24 07:20

把 printf 换成 puts 或者 HAL_UART_Transmit 看能不能绕过去试试。

童雨竹 发表于 2025-7-24 07:22

USB 初始化时最好别混用 printf,有可能冲突 IO,特别是占用中断的地方。

万图 发表于 2025-7-24 07:25

如果要用 printf,重定向到 UART 是最稳的,半主机模式在实际板子容易挂死。

Wordsworth 发表于 2025-7-24 07:29

HAL_Delay 里面要用 SysTick,中断被屏蔽或者优先级不对也会卡住。

Bblythe 发表于 2025-7-24 07:31

你在调试的时候停在 while,printf 没输出,看看是不是卡在 _sbrk 了?

Pulitzer 发表于 2025-7-24 07:32

有没有试过用 retarget.c 或者 ITM 重定向?比半主机要稳一点。

Uriah 发表于 2025-7-24 07:33

Min_Heap 和 Min_Stack 改这么大其实没太大用,重点看 newlib 怎么配置的。

Clyde011 发表于 2025-7-24 07:34

如果只是想打印调试信息,试试 SWO trace,Nucleo-l4r5zi 是支持的。

duo点 发表于 2025-7-24 15:50

可能是HAL_Delay()依赖的SysTick中断与USB中断冲突,或USB中断优先级未正确设置。

elephant00 发表于 2025-7-24 16:03

升级HAL库,重新生成代码。

flycamelaaa 发表于 2025-7-24 16:51

USB库的中断服务程序可能被错误配置了。

powerantone 发表于 2025-7-24 17:51

堆栈溢出?

classroom 发表于 2025-7-24 19:57

检查USB中断配置,禁用无关中断。

jcky001 发表于 2025-7-24 21:58

最小化printf依赖,简化重定向实现。

cr315 发表于 2025-7-24 21:59

替换printf为直接UART发送试试。

stormwind123 发表于 2025-7-24 22:52

printf依赖_write()系统调用,若重定向实现不当,可能导致硬件异常。
页: [1]
查看完整版本: Nucleo项目在系统内存中挂起