stm32延時時間不對,晶振不起振等問題分析

今天新同事給我一個板子,說他剛畫的stm32延時不正確,流水燈時間不對,在簡單地檢查了他的主程序之後,發現只有一個延時2秒+LED的I/O輸出跳變的程序循環。其中I/O的配置也是正確的,但是延時時間完全不對,似乎加長了10倍還多。

這種情況很明顯,時鐘有問題了。

關於時鐘的問題,一般第一步就去看晶振有沒有起振。打開系統文件system_stm32f10x.c,翻到793-797行,這裏是系統等待晶振起振的死循環:

其中,這個死循環的跳出條件兩個,一個是起振了(HSEStatus==1),另一個就是等待超時(StartUpCounter==500)。HSEStatus是自帶的判斷標誌位,如果晶振起振了,則自動置1;StartUpCounter是一個初始值爲0的計數器,當每一次循環自加1,直到等待了500次還沒有起振,那我就不等了;判斷晶振是否起振,可以在這裏打上斷點,或者把HSEStatus或StartUpCounter放到watch裏查看。

比較幸運的是,這次同事的問題就是沒有起振,也沒有進一步去排除其他問題的必要了。反覆查看他的電路原理圖,發現他晶振旁路的22pf的電容忘記接地了,跳線後解決。

 

後記:如果晶振也起振了,但是起振時間過長,檢查可以嘗試檢查復位電路的RC值是否匹配;另外對應用內部滴答時鐘延時的同學,還可以去查看是否裝值時超標了,比如想延時2秒,結果直接往delay_ms裏寫了2000,這種小錯誤;另外如果選用的晶振非常用8M晶振,還需要去系統文件裏更改倍頻係數等等操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章