stm32使用官方庫代碼序列槽亂碼問題(外部晶振設定)
問題産生
引子
早段時間去學了一些算法,然後stm32的東西已經忘光了,然後現在想自己組織課程從頭學習一下,把stm32晶片内的外設配置大概過一遍,也就是都寫一個簡單的程式作為熱身這樣子。
雖然正點原子、野火、硬石之類的stm32教學的大佬給出了大量的寶貴資源,但是我隻是想編寫一些簡單的demo作為自己的熱身之用,相對于他們的每個課程的實驗設計顯得很繁雜,于是乎,使用的資源鎖定在了stm32的官方标準庫自帶的例程裡。
官方标準庫的例程可以說相當精簡了,而且充分表現了stm32處理器的特性。
于是乎,我是按照stm32官方标準庫内的資料提示,建立了MDK下的工程
但是呢,因為學生黨放假在家嘛,手裡拿的是啟明stm32f4的闆子,想着它的闆載資源多一些,在家也能學的東西多一些。
正在我在贊歎stm32的庫使用友善,提示人性化的時候。我因為官方資源設定跟自己手頭的開發闆實體屬性不配套陷入了一些坑。
發現問題
1.當我編寫序列槽程式的時候,發現一個奇怪的現象。我編寫的代碼(隻有main.c)直接複制粘貼到正點原子的可以用,但是在我的工程下使用就不行。
2.仔細對照工程的各方面的設定又完全一樣
3.各個寄存器所在的位址也是完全一樣。
4.使用過51單片機的我,反應告訴我,一定要注意晶振的使用,以及庫檔案相關配置。
問題鎖定在stm32f4xx.h檔案上
逐漸翻查,讓兩個工程的程式、使用的檔案逐漸靠攏,最後發現是stm32f4xx.h檔案這個檔案上的問題。
這裡順帶提一下。keil5自帶的stm32f4xx.h是1.3.0的版本,手頭拿到的固件庫的版本是1.4.0版本。 如果工程内沒有這個頭檔案,那麼MDK會使用他自帶的,但是1.3.0版本會有幾個寄存器是1.3.0中沒寫有的。
會出現諸如
office_src\STM32_StdPeriph_Driver\stm32f4xx_flash_ramfunc.c(110): error: #20: identifier “PWR_CR_FISSR” is undefined
之類的編譯錯誤。
經過一遍遍的工程檔案的頭檔案引用更換,确定了stm32官方給的頭檔案跟正點原子的頭檔案有一定差別,雖然打開檢視幾乎看不出差異。
但是,還是要本着打破砂鍋折騰到底的精神,把這兩個差異找出來。
于是乎,使用了強大的word的文本對比功能。
亂碼原因以及外部晶振設定
原來在stm32f4xx.h内有一個宏定義,用于确定外部高速晶振的大小以友善進行跟高速晶振有相關設定的外設進行配置。
通過文本對比可以看到官方的頭檔案跟正點原子的頭檔案的不同。
可以看出,正點原子把官方自己配的25MHz的外部高速晶振換成了8MHz的外部高速晶振的配置.
還把諸如 u32 u16之類的辨別符号删了。
stm32的序列槽使用的是外部高速時鐘的時鐘源
序列槽外設是挂在APB總線上的,一般用于低速外設,他是AHB總線時鐘分頻所得。
這樣設計分頻是為了降低低速外設的開關損耗。
然而AHB總線的時鐘又源自于高速時鐘源。高速時鐘源可以是高速内部時鐘、高速外部時鐘、高速内部或外部時鐘PLL倍頻所得。
是以最終序列槽的波特率受高速時鐘的影響。
通過本次調試,必須要說的一點的是:如果你們的某一個設計為了降低功耗而降低的高速時鐘的晶振頻率、或者為了提高性能而使用具有更高速率的外部晶振,這時候請一定記得修改stm32f4xx.h相關的配置。