前言
- 上段时间,调试单片机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)问题排查需要认真,排除【硬件问题】。