天天看點

嵌入式軟體開發經驗分享--謹慎使用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)問題排查需要認真,排除【硬體問題】。

繼續閱讀