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时会出现。
请教这种问题如何解决?
你这个看起来像是 printf 的 syscalls 没配置好,卡到 _write 里了吧? 有没有开 USE_SEMIHOSTING?Nucleo 用 ST-LINK 半主机模式会进 HardFault。 把 printf 换成 puts 或者 HAL_UART_Transmit 看能不能绕过去试试。 USB 初始化时最好别混用 printf,有可能冲突 IO,特别是占用中断的地方。 如果要用 printf,重定向到 UART 是最稳的,半主机模式在实际板子容易挂死。 HAL_Delay 里面要用 SysTick,中断被屏蔽或者优先级不对也会卡住。 你在调试的时候停在 while,printf 没输出,看看是不是卡在 _sbrk 了? 有没有试过用 retarget.c 或者 ITM 重定向?比半主机要稳一点。 Min_Heap 和 Min_Stack 改这么大其实没太大用,重点看 newlib 怎么配置的。 如果只是想打印调试信息,试试 SWO trace,Nucleo-l4r5zi 是支持的。 可能是HAL_Delay()依赖的SysTick中断与USB中断冲突,或USB中断优先级未正确设置。 升级HAL库,重新生成代码。 USB库的中断服务程序可能被错误配置了。 堆栈溢出? 检查USB中断配置,禁用无关中断。 最小化printf依赖,简化重定向实现。 替换printf为直接UART发送试试。 printf依赖_write()系统调用,若重定向实现不当,可能导致硬件异常。
页:
[1]