天天看点

嵌入式软件开发经验分享--谨慎使用printf

前言

  • 上段时间,调试单片机STM32F100C8T6的程序。这个单片机的引脚与STM32F103C8T6一致,由于之前的程序都是基于STM32 标准库的,所以这次打算把驱动都移植到STM32 HAL库。
  • 硬件上,使用之前自己画的STM32F103C8T6的板子上,单片机改为STM32F100C8T6。
  • 代码烧写后,发现程序不跑,DEBUG可以跑,但直接下载后,不跑,连控制GPIO都不控制!!

问题排查

【硬件问题】 or 【软件问题】?

【硬件问题排查】:

  • 排查电路设计:应该可以用。
  • 排查焊接:发现焊接无短路等问题
  • 排查电源:供电+3.3V正常
  • 排查J-Link影响程序运行,更换J-Link无效。
  • 初步认为,不是硬件问题。

【软件问题排查】

  • 板子是自己焊的,晶振正常,BOOT0 BOOT1,都是正常的。芯片淘宝来的,理论上不应该不能用。
  • 代码,逐行注释,不管用。
  • 因为驱动都是堆上去的。所以二分法,通过移除部分驱动,验证程序是否正常跑。

最后,用了官方 STM32CubeMX 生成的代码,点个LED灯,居然可以正常的运行。【排除了硬件问题】

虽然明白了驱动问题,但驱动的代码,没有执行,也会有影响?通过对比代码,找到问题点!!缩小问题的范围。

问题锁定

(1)为了减少代码的Flash大小,关闭了Keil MDK的 【Use MicroLib】,不使用微库。

(2)本来打算使用UART作为printf,但是,给注释掉了。

(3)在一个驱动文件里,使用了printf。也就是没打开微库,没有使用uart映射,直接使用printf。

(4)即使【含有printf】的代码,没有调用,依旧影响程序的运行(无法启动!)。

解决方法

(1)注释掉printf,程序正常。

(2)打开Keil MDK的配置,使用微库【Use MicroLib】,程序正常(注意,这个printf没有映射到UART上。)

(3)打开UART驱动了的printf映射,重写  int fputc(int ch, FILE *f),程序正常。

总结

(1)谨慎使用printf。

(2)注意【Use MicroLib】选项

(3)问题排查需要认真,排除【硬件问题】。

继续阅读