前言
- 上段時間,調試單片機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)問題排查需要認真,排除【硬體問題】。